删除算术表达式中的括号
#include<bits/stdc++.h> using namespace std; // ofstream __f("E:/123.txt"); // #define cout __f //括号判断准则 // 括号前边为 “ - ”,且括号中为 “ + ” 或 “ - ”,不能删除; // 括号前边为 “ / ”,不能删除; // 括号后为 “ * ”,且括号中为 “ + ” 或 “ - ”,不能删除; // 有以下几种情况是可以删除: // 括号前和后为 “ + ” 或 “ - ”,括号中为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除,但是注意:若括号前为 “ - ”,括号中为 “ + ” 或 “ - ”,在前边已经处理了,所以可以排除这种情况; // 括号前为 “ * ”,括号中为 “ * ” 或 “ / ”,括号后为 “ + ” 或 “ - ” 或 “ * ” 或 “ / ”,可以删除; // 其他情况不能删除 //去括号必须先去里面的再去外面的,递归处理 char s[300]; int n; bool judge(int l,int r){ int i,s1=0,s2=0; if(l>=1){ if(s[l-1]=='/') return false; //判断+-,不算在子括号内的+- for(int i=l+1;i<=r;i++){ if(s[i]=='(') break; if(s[i]=='+'||s[i]=='-') s1++; if(s[i]=='*'||s[i]=='/') s2++; } for(int i=r-1;i>=l;i--){ if(s[i]==')') break; if(s[i]=='+'||s[i]=='-') s1++; if(s[i]=='*'||s[i]=='/') s2++; } if(s1!=0&&s[l-1]=='-') return false; if(s1!=0&&r<=n-2&&(s[r+1]=='*'||s[r+1]=='/')) return false; } if(l>=1&&(s[l-1]=='+'||s[l-1]=='-')) return true; if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-')) return true; if(l==0&&r==n-1) return true; if(r<=n-2&&(s[r+1]=='+'||s[r+1]=='-'||s[r+1]=='*'||s[r+1]=='/')){ if(s1==0&&s2!=0) if(l>=1&&s[l-1]=='*') return true; } return false; } void f(int l,int r){ int k1=-1,k2=-1,f1,f2; for(int i=l;i<=r;i++) if(s[i]=='('){ k1=i; break; } if(k1==-1) return;//没括号 f1=f2=0; f1++; for(int i=k1+1;i<=r;i++){ if(s[i]=='('){ f1++; // f(i,r);//递归先处理子括号,但是这样很慢 } if(s[i]==')') f2++; if(f1==f2){ if(judge(k1,i)){ //可以删除 s[i]=s[k1]=' '; } f(k1+1,i-1);//一样 if(i+1<n&&i+1<=r)//有右边 f(i+1,r);//对后面进行处理 break; } } } int main() { cin>>s; n=strlen(s); f(0,n-1); for(int i=0;i<n;i++) if(s[i]!=' ') cout<<s[i]; cout<<endl; return 0; }