总结归纳
- 算法思想: 设置一个空栈,顺序读取括号。读取左括号时,将括号入栈;读取右括号时,弹出栈顶元素,栈顶即是与之匹配的最近的左括号。
- 匹配不成功的三种情况:(1)读取右括号时,此时栈空,没有与之匹配的左括号。(2)读取右括号时,弹出的栈顶左括号与之不匹配。(3)顺序读取括号后,栈不为空,即有括号未被匹配。
代码实践
#include <iostream>
#define MaxSize 10
using namespace std;
typedef char ElemType;
struct SqStack {
ElemType data[MaxSize];
int top;
};
void InitStack(SqStack &S) { S.top = -1; }
bool StackEmpty(SqStack S) {
if (S.top == -1) {
return true;
} else {
return false;
}
}
bool Push(SqStack &S, ElemType x) {
if (S.top == MaxSize - 1) {
return false;
} else {
S.top++;
S.data[S.top] = x;
return true;
}
}
bool Pop(SqStack &S, ElemType &x) {
if (S.top == -1) {
return false;
} else {
x = S.data[S.top--];
return true;
}
}
bool BracketMatch(char str[], int len) {
SqStack S;
InitStack(S);
for (int i = 0; i < len; i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
Push(S, str[i]);
} else {
if (StackEmpty(S)) {
return false;
}
char topElem;
Pop(S, topElem);
if (str[i] == ')' && topElem != '(') {
return false;
}
if (str[i] == ']' && topElem != '[') {
return false;
}
if (str[i] == '}' && topElem != '{') {
return false;
}
}
}
return StackEmpty(S);
}
int GetLength(char str[]) {
int i = 0;
while (str[i] != '\0') {
i++;
}
return i;
}
int main() {
char str[MaxSize];
cin >> str;
int len = GetLength(str);
bool result = BracketMatch(str, len);
cout << result << endl;
return 0;
}