题目描述
假设一个表达式有英文字母(小写)、运算符(+
、-
、*
、/
)和左右小(圆)括号构成,以 @
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES
;否则输出 NO
。表达式长度小于 255,左圆括号少于 20 个。
输入格式
一行:表达式。
输出格式
一行:YES
或 NO
。
#include<iostream>
#include<string>
#define MaxSize 20
using namespace std;
typedef struct Stack {
int top; // 栈顶指针
char data[MaxSize]; // 存放栈中元素
} SqStack;
bool Push(SqStack &s, char x) {
if (s.top == MaxSize - 1)
return false;
s.data[++s.top] = x;
return true;
}
bool Pop(SqStack &s, char &x) {
if (s.top == -1)
return false;
x = s.data[s.top--];
return true;
}
int main() {
SqStack s;
s.top = -1; // 初始化栈顶指针
string expression;
char endMarker = '@';
int flag = 1;
cin >> expression;
for (int i = 0; i < expression.length(); i++) {
if (expression[i] == '(') {
Push(s, '(');
}
else if (expression[i] == ')') {
char x;
if (Pop(s, x)) {
} else {
flag = 0;
cout << "NO" << endl;
break;
}
}
}
if (flag && s.top == -1) {
cout << "YES" << endl;
} else if(flag&&s.top>-1) {
cout << "NO" << endl;
}
return 0;
}