2238: 括号匹配(栈和队列)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 42 Solved: 28
[ Submit][ Status][ Web Board]
Description
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。
Input
5+{[2X5]+2}
Output
YES
Sample Input
8-[{2+7]}
Sample Output
NO
HINT
Source
和昨天做的一道poj题差不多 巩固一下
ACcode:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int stack[100],top;
int main(){
string s;
while(cin>>s){
top=0;
bool flag=true;
for(int i=0;i<s.length();++i){
if(s[i]=='{')
stack[top++]=3;
else if(s[i]=='[')
stack[top++]=2;
else if(s[i]=='(')
stack[top++]=1;
else if(s[i]=='}'){
if(stack[top-1]==3)
top--;
else if(top==0){
flag=false;
break;
}
else stack[top++]=3;
}else if(s[i]==']'){
if(stack[top-1]==2)
top--;
else if(top==0){
flag=false;
break;
}else stack[top++];
}else if(s[i]==')'){
if(stack[top-1]==1)
top--;
else if(top==0){
flag=false;
break;
}else stack[top++]=1;
}
}
//cout<<top<<'\12';
//for(int i=0;i<top;++i)printf("stack[%d]=%d\n",i,stack[i]);
for(int i=0,j=top-1;i<=j;++i,--j)
if(stack[i]!=stack[j]){
flag=false;
break;
}
printf(flag?"YES\n":"NO\n");
}
return 0;
}