算法思想为:
- 初始化一个空栈,顺序读入括号序列。
- 若是左括号,作为一个新的更紧急期待括号压入栈中,原栈顶元素期待急迫性下降一级。
- 若是右括号,将栈顶的最急迫期待元素取出,检测是否与之配对。如不是,终止判断,括号序列不匹配。
- 若是非法字符,终止判断,括号字符序列不匹配。
- 算法结束时,若栈为空,括号序列匹配,否则括号序列不匹配。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXSIZE 100
typedef struct {
char *base;
char *top;
int stackSize;
}SqStack;
// 初始化
bool initStack(SqStack &S) {
S.base = new char[MAXSIZE];
if (!S.base) {
return false;
}
S.top = S.base;
S.stackSize = MAXSIZE;
return true;
}
// 判空
bool isEmpty(SqStack S) {
if (S.base == S.top) {
return true;
} else {
return false;
}
}
// 判满
bool isFull(SqStack S) {
if (S.top - S.base == MAXSIZE) {
return true;
} else {
return false;
}
}
// 入栈
bool push(SqStack &S, char e) {
if (isFull(S)) {
return false;
}
*S.top++ = e;
return true;
}
// 出栈
bool pop(SqStack &S, char &e) {
if (isEmpty(S)) {
return false;
}
e = *--S.top;
return true;
}
// 取栈顶元素
char getTop(SqStack S) {
if (S.base != S.top) {
return *(S.top-1);
}
return -1;
}
int main() {
char a[100];
while (~scanf("%s", a)) {
int len = strlen(a);
// 初始化栈
SqStack S;
initStack(S);
char e;
bool isValid = true; // 括号序列是否合法
for (int i = 0; i < len; ++i) {
if (a[i] == '(' || a[i] == '[') { // 左括号入栈
push(S, a[i]);
} else if (a[i] == ')' || a[i] == ']') { // 右括号出栈检测
if (a[i] == ')' && getTop(S) == '(') {
pop(S, e);
} else if (a[i] == ']' && getTop(S) == '[') {
pop(S, e);
} else { // 不匹配
break;
}
} else { // 非法
isValid = false;
break;
}
}
if (isValid) {
if (isEmpty(S)) {
cout << "括号字符序列匹配" << endl;
} else {
cout << "括号字符序列不匹配" << endl;
}
} else {
cout << "括号字符序列不合法" << endl;
}
}
return 0;
}