【TFLSnoi李志帅】第三篇文章

满分代码,建议可以允许尽量不要直接copy,不喜勿喷嗷~

1353:表达式括号匹配(stack)


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 11556     通过数: 6141

【题目描述】

假设一个表达式有英文字母(小写)、运算符(+/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

【输入】

一行数据,即表达式。

【输出】

一行,即“YES” 或“NO”。

【输入样例】

2*(x+y)/(1-x)@

【输出样例】

YES

【提示】

【样例输入2】

(25+x)*(a*(a+b+b)@

【样例输出2】

NO



——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 char sta[300];//本题要用到栈
 4 int t=0;
 5 void push(char x)
 6 {
 7     sta[++t]=x;
 8 }
 9 void pop()
10 {
11     t--;
12 }
13 bool empty()
14 {
15     return t==0?1:0;//特殊声明:t==0?1:0 换一种写法是 if(t==0)return 1;else return 0;
16 }
17 int top()
18 {
19     return sta[t];
20 }
21 void clear()
22 {
23     t=0;
24 }
25 int size()
26 {
27     return t;
28 }
29 int main()
30 {
31     char a[300];
32     int sum=0,flag=1;
33     gets(a);
34     sum=strlen(a); //获取字符串a的长度
35     for(int i=0;i<sum;i++)
36     {
37         if(a[i]=='(')push(a[i]);
38         if(a[i]==')'){
39             if(top()=='(')//一一对应括号,不需要管其它数字运算符
40             pop();
41             else{
42                 flag=0;//当括号无法一一对应时,直接跳出循环,输出“NO”,flag作为判断旗帜,int冒充bool类型(嘿嘿
43                 break;
44             }
45         }
46     }
47     if(empty()==0)flag=0;//判断另一种特殊情况:左括号数量大于右括号;
48     if(flag)cout<<"YES";
49     else cout<<"NO";
50     return 0;
51 }
原文地址:https://www.cnblogs.com/TFLSc1908lzs/p/13530522.html