题目描述
假设一个表达式有英文字母(小写)、运算符(
+
、-
、*
、/
)和左右小(圆)括号构成,以@
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出YES
;否则输出NO
。表达式长度小于 255,左圆括号少于 20 个。
输入格式
一行:表达式。
输出格式
一行:YES
或 NO
。
输入输出样例
输入 #1复制
2*(x+y)/(1-x)@
输出 #1复制
YES
输入 #2复制
(25+x)*(a*(a+b+b)@
输出 #2复制
NO
说明/提示
表达式长度小于 255,左圆括号少于 20个。
题目分析
- 首先用字符数组去存放表达式,两个变量来存放右括号和左括号的个数
- 易错点为在判断右括号时必须右括号的个数得小于左括号
- 如果左括号等于右括号的话那么会输出YES,否则会输出NO
AC代码示例
#include<bits/stdc++.h>
using namespace std;
char a[10005];
int r,l;
int main()
{
cin>>a;
for(int i=0; a[i]!='\0'; i++)
{
if(a[i]=='(')l++;//左括号的个数
if(a[i]==')'){r++;//右括号的个数
if(r>l)//如果在判断右括号时发现右括号个数大于左括号那么这个表达式必定匹配错误
printf("NO");
return 0;
}}
}
if(r==l)printf("YES");//左括号个数等于右括号个数时输出YES
else printf("NO");//否则输出NO
return 0;
}
注:该代码可能欠缺改进,有特殊情况未考虑