烟大 2238: 括号匹配(栈和队列)

2238: 括号匹配(栈和队列)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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 }
View Code

Freecode : www.cnblogs.com/yym2013

原文地址:https://www.cnblogs.com/yym2013/p/3255144.html