大意:输入若干条式子,其中包含一些多余的括号(但全部都符合前配后)和空格,不改变运算符,输出没有多余括号和空格的式子。
分析:主要考虑五种情况:1、整个式子在括号内,要忽略括号;2、'+'后的括号要忽略;3、'-'后的括号要保留;4、(A)这样的括号要忽略;5、同时多个括号叠加要忽略,如((()))。考虑到情况比较多而复杂,我先做大概处理,然后再单独处理(A)这样的情况。注意用栈做好括号的匹配。
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
stack<char> sk;
char s[256],result[256];
int i,j,t;
cin>>t;
getchar();
while(t--)
{
cin.getline(s,256);
for(i=0,j=0;s[i]!='\0';i++)//初步处理,先忽略(A)这种类型的括号
{
if(s[i]>='A'&&s[i]<='Z'||s[i]=='+'||s[i]=='-')
result[j++]=s[i];
else
{
switch(s[i])
{
case '(':
if(j==0||result[j-1]!='-')//只要括号前是'+'或括整条式,忽略
sk.push('(');
else
{
result[j++]='(';//括号前是'-' ,先保留,并做标记保留')'
sk.push('?');
}
break;
case ')':
if(sk.top()!='(')//有标记的保留
result[j++]=')';
sk.pop();//吐掉前面压入的'('或标记
break;
}
}
}
result[j]='\0';
for(i=0;i<j;i++)//单独处理(A)这种类型
{
if(result[i]!='*')
{
if(result[i]=='('&&result[i+2]==')')//作标记
{
result[i+2]='*';
continue;
}
cout<<result[i];
}
}
cout<<endl;
while(!sk.empty())//清空栈
sk.pop();
}
return 0;
}