【ACM】括号配对问题

括号配对问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
现在,有一行括号序列,请你检查这行括号是否配对。
 
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
思路:括号匹配问题,读取到左边的括号,入栈,读取到右边的从栈顶拿出进行匹配,失败即为不匹配的串,否则继续处理
 
#include <iostream>
#include <string>
using namespace std;

struct stack{
    int num;
    string str;
};

int main(){

    int n;
    cin>>n;
    string ss;
    stack a;
    int i;
    while(n--){
        cin>>ss;
        a.num = 0;
        a.str = "";
        if (ss.length()%2!=0)
        {
            cout<<"No"<<endl;
        }else
        {
            if (ss[0]!='[' && ss[0]!='(')
            {
                cout<<"No"<<endl;
            }
            else
            {
                for (i = 0 ; i < ss.length(); i++)
                {
                    if (ss[i]=='('||ss[i]=='[')
                    {
                        a.str = a.str + ss[i];
                        a.num++;
                    }
                    else if (ss[i]==')')
                    {
                        if (a.str[a.num-1]=='(')
                        {
                            a.num--;
                            string temp = "";
                            for (int j = 0 ; j < a.num ; j++)
                            {
                                temp += a.str[j];
                            }
                            a.str = temp;
                        }
                    }
                    else if (ss[i]==']')
                    {
                        if (a.str[a.num-1]=='[')
                        {
                            a.num--;
                            string temp = "";
                            for (int j = 0 ; j < a.num ; j++)
                            {
                                temp += a.str[j];
                            }
                            a.str = temp;
                        }
                    }
                }
                if (i==ss.length() && a.num==0)
                {
                    cout<<"Yes"<<endl;
                }else{
                    cout<<"No"<<endl;
                }
            }

        }

    }

    return 0;
}        
原文地址:https://www.cnblogs.com/lyc94620/p/9289138.html