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
题目很简单,用数组或者string遍历或者stack都可以,主要是要注意下用cin和getline组合是产生的那个回车问题
以下是未评测代码
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<iomanip>
#include<stack>
#include<list>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
cin.ignore();
/*getline(cin,str)的读取原理是将以'\n'为结束符做为一完整读取的一行,'\n'会读。
所以当之前用cin读取一个字符的时候,你会输入一个字符然后点击回车,那么下面getline(cin,str)读的时候会读入这个回车,并判断结束了。
如果此处不使用cin.ignore()会造成下面读的第一个字符串就是一个空串,从而导致输出结果多一个Yes
*/
for(int k = 0 ;k<n;k++){
string s;
getline(cin,s);
int b1 =0,b2=0;
stack<char> st;
for(int i =0;i<s.length();i++){
st.push(s[i]);
}
if(!st.empty()){
while(!st.empty()){
if(st.top()==']'){
b1++;
st.pop();
}
else if(st.top()==')'){
b2++;
st.pop();
}
else if(st.top()=='('){
b2--;
st.pop();
}
else if(st.top()=='['){
b1--;
st.pop();
}
if(st.empty())break;
else st.pop();
}
if(b1==0&&b2==0)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else{
cout<<"Yes"<<endl;//空串情况
}
while(!st.empty())//清空一下内存空间
st.pop();
}
return 0;
}