平衡的括号(Parentheses Balance, UVa 673)

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;
} 

猜你喜欢

转载自blog.csdn.net/qhlpptdyfn/article/details/79544493