一道水题,不过很多细节没注意结果拖了很久还一直WA,总之用堆来记录括号,整体上还是比较简单的,但是细节一定要想清楚。
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <deque>
using namespace std;
const int maxl= (1<<8)+5;
struct Node
{
int sg;
char op;
int pos;
Node(int ssg= 0, char oop= 0, int ppos= 0) : sg(ssg), op(oop), pos(ppos) {}
};
char sen[maxl];
bool drop[maxl];
stack<Node> S;
char SearchBack(int x)
{
for (int i= x-1; i>= 0; --i){
if (' '!= sen[i]){
return sen[i];
}
}
return '^';
}
int main(int argc, char const *argv[])
{
int kase= 0;
scanf("%d ", &kase);
while (kase--){
while (!S.empty()){
S.pop();
}
memset(drop, 0, sizeof(drop));
fgets(sen, maxl, stdin);
int lth= strlen(sen);
Node t;
for (int i= 0; i< lth; ++i){
if (' '== sen[i]){
drop[i]= 1;
}
else if ('('== sen[i]){
S.push(Node(1, SearchBack(i), i));
}
else if ('+'== sen[i] || '-'== sen[i]){
if (!S.empty()){
S.top().sg= 0;
}
}
else if (')'== sen[i]){
t= S.top();
if ('-'!= t.op || t.sg){
drop[t.pos]= drop[i]= 1;
}
S.pop();
if (!S.empty()){
S.top().sg &= t.sg;
}
}
}
for (int i= 0; i< lth; ++i){
if (!drop[i]){
putchar(sen[i]);
}
}
}
return 0;
}