Description
假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255,左圆括号少于 20 个。
Input
一行:表达式。
Output
一行:YES 或 NO。
Sample 1
Input | Output |
2*(x+y)/(1-x)@ | YES |
Sample 2
Input | Output |
(25+x)*(a*(a+b+b)@ | NO |
Hint
表达式长度小于 255,左圆括号少于 20 个。
问题描述:
题目要求输入运算符和小括号“()”以及英文字母,以@为循环结束。
现编写程序来判断表达式左边的“(”与右边的“)”是否匹配,如果匹配
输出“YES”,否则输出“NO”。
解题思路:
首先对输入表达式进行读入处理:引入变量对其进行判断,若不为@则进
行字符数组读入处理,为@则读入结束;然后进行判断,为“(”则sum1++,
为“)”则sum2++;最后进行sun1与sum2的判断,前者与后者不相等则输
出“NO”,反之“YES”;
错误描述:
未考虑第一个括号为“)”时,无论如何括号都不可能匹配;
未考虑当前面括号匹配时又出现“)”在前的情况;
解决:
当第一个括号为“)”时,令sum1或者sum2为数组最大值以外的值,以确保
最后输出时为“NO”;
当前面出现匹配的括号时,将sum1与sum2的值进行归零处理。
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main() {
char str[256], ch, ch1;
int i = 0;
int len = 0;
int sum1 = 0, sum2 = 0, j = 0;
while (1) {
scanf("%c", &ch);
if (ch != '@') {
str[i] = ch;
i++;
} else {
for ( j = 0; j < i; j++) {
ch1 = str[j];
if (ch1 == '(') {
sum1++;
if (sum1 == sum2) {
sum1 = 0;
sum2 = 0;
}
} else if (ch1 == ')') {
sum2++;
if (sum1 == 0)
sum2=1000;
else if (sum1 == sum2) {
sum1 = 0;
sum2 = 0;
}
}
}
}
if (j == i)
break;
}
if (sum1 != sum2)
printf("NO");
else
printf("YES");
}
#include <bits/stdc++.h>
using namespace std;
int main() {
char str[256], ch, ch1;
int i = 0;
int len = 0;
int sum1 = 0, sum2 = 0, j = 0;
while (1) {
scanf("%c", &ch);
if (ch != '@') {
str[i] = ch;
i++;
} else {
for ( j = 0; j < i; j++) {
ch1 = str[j];
if (ch1 == '(') {
sum1++;
if (sum1 == sum2) {
sum1 = 0;
sum2 = 0;
}
} else if (ch1 == ')') {
sum2++;
if (sum1 == 0)
sum2=1000;
else if (sum1 == sum2) {
sum1 = 0;
sum2 = 0;
}
}
}
}
if (j == i)
break;
}
if (sum1 != sum2)
printf("NO");
else
printf("YES");
}