欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVA673

程序员文章站 2024-03-19 09:13:22
...

Parentheses Balance

 

给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:
(1) 如果是空串,那么合法字符串。
(2) 如果A、B是合法的,那么AB也是合法的字符串。
(3) 如果A是合法的,那么(A)和[A]都是合法的字符串。

换言之,如果字符串中离任一一个右括号(即')'或者’]')的最近的未配对左括号是配对的,且所有左右括号都已配对,那么它就是一个合法的字符串。

Input

输入先是一个正整数n,代表有n个字符串。
接下来是n行字符串,每个字符串一行,注意,可能有空串

Output

对于每组数据,若是合法的字符串,则在单独的一行输出Yes,反之则输出No。

Sample Input

4
([])
(([()])))
([()[]()])()
(([(])))

Sample Output

Yes
No
Yes
No

经典的括号匹配问题,用栈解决。 
左括号入栈,右括号出栈,最终栈空,输出 Yes。注意空行也是yes。

一个栈就解决问题,当时做这题的时候还用两个队列做,我真的是够了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string.h>
#include<iterator>
#include<vector>
#include<stdlib.h>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<sstream>
typedef long long ll;
using namespace std;

int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        stack<char> s;
        string str;
        getline(cin,str);
        int len = str.length();
        for(int i=0;i<len;i++){
            if(len == 0)
            {
                printf("Yes\n");
                continue;
            }
            if(str[i]=='('||str[i]=='[')
                s.push(str[i]);
            else if(str[i]==')'){
                if(s.size()&&s.top()=='(')
                    s.pop();
                else
                    s.push(str[i]);
            }
            else if(str[i]==']'){
                if(s.size()&&s.top()=='[')
                    s.pop();
                else
                    s.push(str[i]);
            }
        }

        if(s.size())
            printf("No\n");
        else
            printf("Yes\n");
    }
    return 0;
}