括号配对问题

来源:互联网 发布:李荣浩2017新专辑知乎 编辑:程序博客网 时间:2024/05/16 06:19

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

算法思路:将字符串放在栈中,遇到匹配的将其弹出去,遇到不匹配的就退出循环。将其匹配和不匹配的记录,然后将其打印。

#include <iostream>#include <algorithm>#include <bits/stdc++.h>#include <stack>using namespace std;int judge[10000];char kuohao[10000];stack<char> s[100];int main(){  int N;  int j = 0;  cin >> N;  for(int i = 0; i < N ; i++)  {    cin >> kuohao;    s[i].push('e');       if(kuohao[j] != '(' && kuohao[j] != ')' && kuohao[j] != '[' && kuohao[j] != ']')       {            memset(kuohao,0,sizeof(kuohao));            judge[i] = 0;            j = 0;            continue;       }       while(kuohao[j] == '(' || kuohao[j] == ')' || kuohao[j] == '[' || kuohao[j] == ']')        {                if(kuohao[j] == '(' || kuohao[j] == '[')                {                    s[i].push(kuohao[j]);                }                if(kuohao[j] == ')')                {                    if(s[i].top() == '(') s[i].pop();                    else  s[i].push(kuohao[j]);                }                if(kuohao[j] == ']')                {                    if(s[i].top() == '[') s[i].pop();                    else  s[i].push(kuohao[j]);                }                j++;        }        memset(kuohao,0,sizeof(kuohao));        if(s[i].top() == 'e') judge[i] = 1;        j = 0;    }    for(int i = 0; i < N ; i++)    {        if(judge[i]) cout << "Yes" <<endl;        else cout << "No" << endl;    }}

优化代码:

#include<iostream>#include<vector>#include<string>using namespace std;int main(){    int n;    cin>>n;    while(n--)    {          vector<char> vec;        string ch;        vec.push_back(' ');        cin>>ch;        for(int i=0;i<ch.length();i++)        {            vec.push_back(ch[i]);            if( vec.back()-1 == *(vec.end()-2) || vec.back()-2 == *(vec.end()-2))            {                vec.pop_back();                vec.pop_back();            }        }        if(vec.size()==1)   cout<<"Yes"<<endl;        else    cout<<"No"<<endl;    }    return 0;}
0 0
原创粉丝点击