题目链接https://www.luogu.org/problemnew/show/P1739
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入输出格式
输入格式:
一行:表达式
输出格式:
一行:“YES” 或“NO”
输入输出样例
输出样例#1:
YES
说明
表达式长度小于255,左圆括号少于20个
分析:可以在扫描字符串的过程中,用栈来存储左括号,遇到右括号则将栈顶的左括号弹出栈。直接模拟即可。
或者可以记录扫描过程中遇到的尚未被右括号抵消掉的左括号还剩下多少个。就是:扫描时遇到左括号则累计增加左括号个数,遇到右括号则将左括号累计个数减掉1个。
下面用栈来处理:
1 #include <stdio.h> 2 int main() 3 { 4 int s[100];//栈 5 char a[300];//表达式 6 int i,j,flag=0;//flag==0表示括号匹配,否则不匹配 7 scanf("%s",a); 8 9 j=-1; 10 for(i=0;a[i]!='@';i++) 11 { 12 if(a[i]=='(') 13 { 14 s[++j]=i;//遇到左括号则将下标入栈 15 } 16 else if(a[i]==')') 17 { 18 if(j>=0)//栈不为空 19 j--; 20 else 21 { 22 flag=1;//匹配失败 23 break; 24 } 25 } 26 } 27 if(j>=0) //栈不为空 28 flag=1; 29 if(flag==1) 30 printf("NO "); 31 else 32 printf("YES "); 33 return 0; 34 }
下面是刘俊东童鞋写的一段代码,就是统计目前剩余未被抵消掉的括号
#include <stdio.h> int main() { char t; int i=0; while(scanf("%c",&t)!=EOF) { if(t=='(') i++; else if(t==')') { if(i<=0) {printf("NO"); return 0;} else i--; } } if(i==0) printf("YES"); else printf("NO"); return 0; }