#P1572. 表达式括号匹配.填空题
表达式括号匹配.填空题
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以 “@” 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回 “YES” ;否则返回 “NO” 。表达式长度小于 255 ,左圆括号少于 20 个。
输入格式
一行数据,即表达式。
输出格式
一行,“YES” 或 “NO” 。
样例
2*(x+y)/(1-x)@
YES
(25+x)*(a*(a+b+b)@
NO
解题思路
这是典型的栈问题。从左到右读一个数学运算时,任何时候看到一个左括号 '(',都是可以的,但是,如果看到了一个反括号 ')' ,那就要看此时它的左边是否有一个左括号,即便左边有左括号。
一个反括号会和左括号两两抵消。这个抵消,就类似是入栈和出栈,来了左括号,就入栈,来了右括号,就出栈。如果来了右括号,栈顶却没有左括号,那就是错误的式子。
本题说了,只验证圆括号的正确性,所以,除了左括号和反括号之外,别的字符都可以不分析。
完成程序
#include<bits/stdc++.h>
using namespace std;
char s[256];
int main()
{
char c;
int top=填空(1); //一开始,空栈
while(cin>>c)
{
if(c=='@')
{
//判断是否空栈,栈如果不是空的,表示缺了一些反括号
if(填空(2) )
printf("NO");
else
printf("YES");
return 0;
}
else
{
if(c=='(')
填空(3) = c; //入栈
else if(c==')')
{
if(top>0&&s[top]==填空(4)) //检查栈顶是不是 '('
填空(5); //如果是,出栈
else //否则,这是错误的表达式
{
printf("NO");
return 0;
}
}
//题目说,只对圆括号的正确性做判断,别的内容不关心
}
}
return 0;
}
填空(1):{{ input(1) }}
填空(2):{{ input(2) }}
填空(3):{{ input(3) }}
填空(4):{{ input(4) }}
填空(5):{{ input(5) }}
相关
在以下作业中: