UVA673
判断括号是否成对,
1. 空字符串是成对的
2. A是成对的,B也是成对的,那么AB并列起来也是成对的
3. A是成对的,A外边套上括号,即(A)或[A],也是成对的。
实现方法:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int main(){
int n;
cin>>n;
getchar();
while(n--){
char s[500];
fgets(s,150,stdin);
vector<char> v;
for(int i=0;i<strlen(s)-1;i++){
//如果字符是]或者),并且栈是空的,直接压栈
if((s[i] ==')'|| s[i]==']') && v.empty())
v.push_back(s[i]);
//如果字符是(或者[,直接压栈
else if(s[i]=='(' || s[i]=='[')
v.push_back(s[i]);
//如果字符是),如果栈顶是(,弹栈,如果不匹配,压栈
else if(s[i] ==')' ){
if(v.back()=='(')
v.pop_back();
else
v.push_back(s[i]);
}
//同上
else if(s[i] == ']' ){
if(v.back()=='[')
v.pop_back();
else
v.push_back(s[i]);
}
}
//如果栈是空的,那说明成功了
if(v.empty() )
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
UVA514
判断顺序排列的一列车(1,2,3,4,5……)能否按照输入的顺序开出车站,比如按照5,4,3,2,1开出可以,按照5,4,1,2,3就不行。
实现方法:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int main(){
int n;
while(cin>>n && n!=0){
int train[n];
while(cin>>train[0] && train[0]!=0){
for(int i=1;i<n;i++)
cin>>train[i];
int count=0;
vector<int> station;
for(int i=1;i<=n;i++){
if(i==train[count]){
count++;
while(!station.empty() && station.back()==train[count]){
station.pop_back();
count++;
}
}
else
station.push_back(i);
}
if(station.empty())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
cout<<endl;
}
return 0;
}