D - Parentheses Balance

        这个题目和那个简单计算器类似,用了栈,如果后面的字符能和前面的字符配对(我没看懂题目意思,大概猜测了一下是这个意思吧~)那么删除前面的字符,当然,这个字符也不要了,如果最后都能配对,那么栈肯定为空,所以通过判断栈是否为空可以获得答案。


Description

  

 

You are given a string consisting of parentheses () and []. A string of this type is said to be correct:

  • (a)

  • if it is the empty string

  • (b)

  • if A and B are correct, AB is correct,

  • (c)

  • if A is correct, (A) and [A] is correct.

Write a program that takes a sequence of strings of this type and check their correctness. Your program can assume that the maximum string length is 128.

 

Input 

The file contains a positive integer n and a sequence of n strings of parentheses () and [], one string a line.

 

Output 

A sequence of Yes or No on the output file.

 

Sample Input 

 

3
([])
(([()])))
([()[]()])()

 

Sample Output 

Yes
No
Yes



下面是我的代码和解释:


#include <iostream>
#include <stack>
#include <string.h>
#include <cstdio>
using namespace std;
const int maxn=128+10;
stack<char> mystr;      //字符栈
int main()
{
    int n;
    cin>>n;
    getchar();      //接收换行符
    while(n--)
    {               //循环计算
        char str[maxn];
        while(!mystr.empty())mystr.pop();       //字符栈不为空就是还没有符合题目给的正确的条件(不知道题目什么意思,自己猜测了一下)
        cin.getline(str, maxn, '\\n');           //换行符结束,这个比较重要
        int len=strlen(str);
        if(!len){cout<<"Yes"<<endl;continue;}   //题目有个空字符串也算OK的条件,这里判断了
        mystr.push(str[0]);
        for(int i=1;i<len;i++)
        {                                       //如果后面的符号能和前面配对就删除前面的,否则push这个字符
            char tchar;
            if(str[i]==')')tchar='(';
            else if(str[i]==']')tchar='[';
            else tchar='gg';
            if(!mystr.empty()&&mystr.top()==tchar)
            {
                mystr.pop();
            }
            else mystr.push(str[i]);
        }
        if(mystr.empty())cout<<"Yes"<<endl;     //通过最后栈里面是否为空来输出
        else cout<<"No"<<endl;
    }
    return 0;
}