NYoj 2 括号配对问题

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
现在,有一行括号序列,请你检查这行括号是否配对。
 
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes


这个不算动态规划,但是升级版很多是DP,或者线段树解决。

数据结构里面最经典的一个问题,这个是最简单的基础版。

栈解决,遍历字符串,要处理的新字符,和当前栈顶比较。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 10000+10;
char str[maxn];
char cur;
int main() {
//    freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
  //抹掉T的回车,gets之间不需要 getchar();
while(T--) { gets(str); int len = strlen(str); int pos = 0,i = 0; stack<char> s;      //字符串最后一个是' ' while(str[i]!='') { if(s.empty()) s.push(str[i]); else { cur = s.top(); if(cur=='(' && str[i]==')') s.pop(); else if(cur=='['&&str[i]==']') s.pop(); else s.push(str[i]); } i++; } if(s.empty()) { puts("Yes"); } else { puts("No"); } } return 0; }

我更喜欢这个版本,字符一个个读入:

#include <iostream>
#include <cstdio>
#include <string.h>
#include <stack>

using namespace std;

void ace(){
    int n;
    scanf("%d", &n);
    char ch;
    char tmp;
    ch = getchar();
    while(n--){
        stack <char> s;
        while((ch = getchar())!= '
'){
            if(s.empty())
                s.push(ch);
            else{
                tmp = s.top();
                if(tmp == '(' && ch == ')')
                    s.pop();
                else if(tmp == '[' && ch == ']')
                    s.pop();
                else
                    s.push(ch);
            }
        }
        if(s.empty())
            printf("Yes
");
        else
            printf("No
");
    }
}


int main() {
//    freopen("in.txt","r",stdin);
    ace();
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingzhao/p/7218737.html