剔除多余括号 C++详解
- 题目描述
- 输入输出样例
- 输入样例
- 输出样例
- 解法&代码
题目描述
剔除四则运算表达式中的多余括号。
输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余的括号,原表达式中所有变量和运算符号相对位置保持不变,并保持与原表达式等价。
输入表达式 | 输出表达式 |
---|---|
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÷(c−d) | a + b ÷ ( c − d ) a+b÷(c-d) a+b÷(c−d) |
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 <bits/stdc++.h>
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;
}