表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+
、-
、*
、/
)和左右小(圆)括号构成,以 @
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES
;否则输出 NO
。表达式长度小于 $255$,左圆括号少于 $20$ 个。
输入格式
一行:表达式。
输出格式
一行:YES
或 NO
。
样例 #1
样例输入 #1
2*(x+y)/(1-x)@
样例输出 #1
YES
样例 #2
样例输入 #2
(25+x)*(a*(a+b+b)@
样例输出 #2
NO
提示
表达式长度小于 $255$,左圆括号少于 $20$ 个。
思路
输入字符,如果是左括号,将其入栈;如果是右括号,先判定栈是否为空,栈空说明不匹配输出No,栈非空则栈顶出栈。直到输入的字符为@时,跳出循环。如果栈空说明括号匹配,输出Yee,否则输出No。
AC代码
#include <iostream>
#include <stack>
#define AUTHOR "HEX9CF"
using namespace std;
int main()
{
stack<char> s;
char ch;
while ((ch = getchar()) != '@')
{
if ('(' == ch)
{
s.push(ch);
continue;
}
if (')' == ch)
{
if (s.empty())
{
cout << "NO" << endl;
return 0;
}
else
{
s.pop();
continue;
}
}
}
if (s.empty())
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
return 0;
}