• POJ 1690


    一道水题,不过很多细节没注意结果拖了很久还一直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;
    }
    
  • 相关阅读:
    白菜:小白菜、青菜
    蔬菜:白菜
    蔬菜-白菜:娃娃菜
    玉米:黑玉米
    坚果-花生:彩色花生
    养生-坚果-花生:黑花生
    汉语-词语:气质
    汉语-词语:痛楚
    汉语-词语:酸楚
    汉语-词语:心酸
  • 原文地址:https://www.cnblogs.com/Idi0t-N3/p/14951330.html
Copyright © 2020-2023  润新知