栈的运用,对每一个左括号做匹配其右括号的标记~ 当括号前的符号为‘-’号时,该括号应保留,否则可以以省略 #include <iostream> #include <stack> using namespace std; int i,j,k,n; char str[260],ans[260]; int num[260]; int main() { scanf("%d",&n); getchar();//notice ! while(n --) { memset(str, 0, sizeof(str)); memset(num, 0, sizeof(num)); gets(str); int len = strlen(str); //printf("%s/n",str); stack<int> st, omit ,ness; //ness -> necessary for(i = 0 ; i < len ; i ++) { if(str[i] == '(') st.push(i); else if(str[i] == ')'){ num[st.top()] = i ; // locate the () position st.pop(); } } int cnt = 0 ; for(i = 0 ; i < len ; i++) { if(str[i] == '('){ if(cnt && ans[cnt -1 ]=='-'){ for(j = i +1 ; j < num[i] ; j ++) if(str[j] == '+' || str[j] == '-') break; // deal with((A)) if(j < num[i]){ ans[cnt++] = '('; ness.push(i); }else omit.push(i); }else omit.push(i); }else if(str[i] == ')'){ int ne = -1; int om = -1; if(!omit.empty()) om = omit.top(); if(!ness.empty()) ne = ness.top(); if(om < ne) { ans[cnt++] =')'; ness.pop(); }else omit.pop(); }else if(str[i]!=' ') ans[cnt++] = str[i]; } ans[cnt] = '/0'; printf("%s/n",ans); } return 0; }