P1739 表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入输出格式
输入格式:
一行:表达式
输出格式:
一行:“YES” 或“NO”
输入输出样例
输入样例#1:
2*(x+y)/(1-x)@
输出样例#1:
YES
输入样例#2:
(25+x)(a(a+b+b)@
输出样例#2:
NO
括号配对问题可以通过栈来实现,我们可以把所有的左括号存入栈中,如果遇到了右括号,则判断栈顶是否存有左括号如果在存在右括号而栈空的情况或者栈不为空而输入已结束的情况就是不匹配,否则就是匹配
代码如下
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
stack <char> s; //建一个栈
char ch;
int flag = 0;
while((ch = getchar()) != '@') //读取字符并判断
{
if(ch == '(')
s.push(ch); //如果是左括号则入栈
if(ch == ')')
{
if(s.empty()) //如果读入右括号时栈为空,则不匹配
{
flag = 1;
break;
}
else
{
s.pop(); // 栈不为空,消除栈顶的括号
}
}
}
if(s.empty()&&flag!=1) //如果栈空了且没有中途不匹配的情况出现则证明匹配
printf("YES\n");
if(flag==1||!s.empty()) //否则不匹配
printf("NO\n");
}