剔除多余括号 C++详解

剔除多余括号 C++详解

  • 题目描述
    • 输入输出样例
      • 输入样例
      • 输出样例
  • 解法&代码

剔除多余括号 C++详解_第1张图片

题目描述

剔除四则运算表达式中的多余括号。
输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余的括号,原表达式中所有变量和运算符号相对位置保持不变,并保持与原表达式等价。

输入表达式 输出表达式
a + ( b + c ) a+(b+c) a+(b+c) a + b + c a+b+c a+b+c
( a × b ) + c ÷ ( d × e ) (a×b)+c÷(d×e) (a×b)+c÷(d×e) a × b + c ÷ ( d × e ) a×b+c÷(d×e) a×b+c÷(d×e)
a + b ÷ ( c − d ) a+b÷(c-d) a+b÷(cd) a + b ÷ ( c − d ) a+b÷(c-d) a+b÷(cd)
a − ( b + c ) a-(b+c) a(b+c) a − ( b + c ) a-(b+c) a(b+c)

注意:输入为a+b时,输出不能是b+a,即相对位置不能变。表达式以字符串输入,长度不超过255,不需要对输入表达式判断是否格式正确(即,程序应该默认输入表达式是格式正确的),所有变量均为单个小写字母,只要去掉所有多余括号,不要求对表达式简化。

输入输出样例

输入样例

a + ( b + c ) a+(b+c) a+(b+c)

输出样例

a + b + c a+b+c a+b+c


解法&代码

你可以使用栈来解决这个问题。遍历输入的表达式,当遇到左括号时,将其索引入栈。当遇到右括号时,弹出栈顶元素,表示与该右括号匹配的左括号的索引。然后,将左括号和右括号之间的子表达式替换为子表达式本身(即去掉括号)。最后,输出替换后的表达式。

因此代码如下:

#include 
using namespace std;
int d[128],l;
string s;
stack <int> st;
int main()
{
	cin >>s; l=s.size();
	d['/']=4; d['*']=3; d['-']=2; d['+']=1;
	for (int i=0;i<l;i++)
	{
		if (s[i]=='/' || s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='(')
			st.push(i);
		if (s[i]==')')
		{
			int k;
			for (k=5;s[st.top()]!='(';st.pop())
				k=min(k,d[s[st.top()]]);
			int head=-1,tail=-1;
			if (i+1<l && s[i+1]!=')')
				tail=d[s[i+1]];
			if (st.top()-1>=0 && s[st.top()]!=')')
				head=d[s[st.top()-1]];
			if (k>=tail && k>=head)
				s[i]=s[st.top()]=0;
			if (k==1 && tail==2 && head<=1 || k==3 && tail==4 && head<=3)
				s[i]=s[st.top()]=0;
			st.pop();
		}
	}
	for (int i=0;i<l;i++)
		if (s[i]!=0)
			cout <<s[i];
	return 0;
}

你可能感兴趣的:(C++专栏,c++,算法)