南阳理工acm 括号配对问题

题目信息: 
 

括号配对问题

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述

现在,有一行括号序列,请你检查这行括号是否配对。

输入

第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符

输出

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

样例输入

3
[(])
(])
([[]()])
样例输出

No
No
Yes

思路:

这个题目中涉及的括号配对问题,使用堆栈(stack)的先进后出的特性来解决。在c++中使用STL(标准模板库)的stack头文件:

1)遍历输入的字符串数组:

       当堆栈s对象为空时,直接入栈;

       不为空时,判断和栈首元素是否配对,如果配对将栈首元素出栈,否则入栈

2)遍历结束判断:如果堆栈s为空,配对成功,否则失败


代码:

#include <iostream>
#include <cstring>
#include <stack> //堆栈头文件
using namespace std;
#define MaxSize 10010
int main(){
    int n,len;
    stack<char>s; //定义堆栈对象
    char str[MaxSize];
    cin>>n;
    while(n--){
        cin>>str;
        len=strlen(str);
        if(len%2!=0){    //如果括号字符串是奇数时
            cout<<"No"<<endl;
            continue;
        }
        for(int i=0;i<len;i++){
            if(s.empty()) s.push(str[i]);//当堆栈为空时
            else if((s.top()=='('&&str[i]==')')||(s.top()=='['&&str[i]==']')) s.pop();
            else s.push(str[i]);
        }
        if(s.empty()) cout<<"Yes"<<endl;
        else{
            cout<<"No"<<endl;
            while(s.size()){ //因为我定义的堆栈对象在while函数外面,所以每次都要清空
                s.pop();
            }
        }
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/sicauliuy/article/details/80099933
今日推荐