2238: 括号匹配(栈和队列)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2 Solved: 2
[Submit][Status][Web Board]
Description
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。
Input
5+{[2X5]+2}
Output
YES
Sample Input
8-[{2+7]}
Sample Output
NO
HINT
Source
Code:
1 /* 2 所用操作函数: 3 empty() 堆栈为空则返回真 4 pop() 移除栈顶元素 5 push() 在栈顶增加元素 6 top() 返回栈顶元素 7 */ 8 #include <iostream> 9 #include <stack> 10 #include <string.h> 11 using namespace std; 12 int main() 13 { 14 string l; 15 while(cin>>l){ 16 stack <char> s; //放到循环外定义就错了,每次循环都要初始化 17 bool f=true; 18 for(int i=0;i<l.length();i++){ 19 switch(l[i]){ 20 case '(':s.push('(');break; 21 case '[':s.push('[');break; 22 case '{':s.push('{');break; 23 case ')':if(s.top()!='(') f=false; //如果栈顶元素值与当前字符括号匹配则将匹配的前括号出栈 24 else s.pop(); 25 break; 26 case ']':if(s.top()!='[') f=false; 27 else s.pop(); 28 break; 29 case '}':if(s.top()!='{') f=false; 30 else s.pop(); 31 break; 32 default:break; 33 } 34 if(!f) break; 35 } 36 if(!s.empty()) f=false; //判断是否栈空 37 if(f) 38 cout<<"YES"<<endl; 39 else 40 cout<<"NO"<<endl; 41 } 42 return 0; 43 }
Freecode : www.cnblogs.com/yym2013