P1739 表达式括号匹配
表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+
、-
、*
、/
)和左右小(圆)括号构成,以 @
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 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 个。
分析
例如 ( ( ) ) ( ) 是可以的。 ( ) ) ( ( ) 却是不可以。
括号是左右对称的,如果前一半中多了左,后一半中可以用右来覆盖,但如果前一半中多了右的话,就缺少了左,就不能组成括号,这就是为什么可以多左但不能多右,这也就是ok变量为什么不能<0。
提交答案
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>//头文件
using namespace std;//不加这个会出错(告诉一些新人的,大佬勿喷)
int ok=0;//状态的变量(大佬千万别改bool)
char a;//记录字符
int i=0;//之后的特判要用
int main()
{
for (;;i++)//很无脑对不对,但是很有用
{
a=getchar();//读入
if (i==0&&a==')') {printf ("NO");return 0;}//特判:第一个为‘)’,结束,不对,自己想想看
if (a=='(') ok++;//是左括号就++
if (a==')') ok--;//是有括号就--
if (ok<0) {printf ("NO");return 0;}//特判:多了右括号,结束(多了左没事,但不可以多右,想想看)
if (a=='@') {if (!ok) printf ("YES");else printf ("NO");return 0;}
//特判无效:比较ok是不是为0(是0表示左右括号都一样多,结束),只要ok不等于0,左右括号的数目就不相等,就是无效的,输出NO
}
}
标签:ok,括号,NO,样例,P1739,include,表达式
From: https://www.cnblogs.com/bujidao1128/p/17197966.html