模拟——删除不必要的括号

来源:互联网 发布:车床切断面编程 编辑:程序博客网 时间:2024/05/20 10:53

注意:( (x+y) )z 这种情况,括号中的+共用!

出数据时注意复用的非常规情况。

(x+( (x+y) ( y ) ( t ) +m )  )z      

#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstring>#include<vector>using namespace std;char s[2010];int p[2010],flag[2010],stack[2010];//很显然用栈结构来做 int main(){while(scanf("%s",s)!=EOF){int top=-1;memset(p,0,sizeof(p));memset(flag,0,sizeof(flag));int len=strlen(s);for(int i=0;i<len;i++){if(s[i]=='(')stack[++top]=i;else if(s[i]=='+')flag[stack[top]]=1;else if(s[i]==')'){bool f=i<len-1&&s[i+1]!='+'&&s[i+1]!=')';bool g=stack[top]>0&&s[stack[top]-1]!='+'&&s[stack[top]-1]!='(';//当括号内部有加法,并且外部乘以某数时,括号不能删除 if(!(flag[stack[top]]&&(f||g)))p[stack[top]]=p[i]=1;//当两个括号紧邻(())时,括号内部的加号共用 if(i<len-1&&s[i+1]==')'&&stack[top]>0&&s[stack[top]-1]=='(')flag[stack[top-1]]=flag[stack[top]];top--;}}for(int i=0;i<len;i++)if(p[i]==0)printf("%c",s[i]);printf("\n");}return 0;}


0 0
原创粉丝点击