【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 }