这里把在王道数据结构中栈在括号匹配中的应用做一下详细的注释,包括一些个人敲代码时遇到的问题。看看有没有帮到你。
1.栈的基本操作
#include <iostream>
#define Max 15
using namespace std;
struct Stack {
char arr[Max];
int top;
};
//初始化栈
bool InitStack(Stack& stack) {
stack.top = -1;
return true;
}
//插入操作
bool Push(Stack& stack, char x) {
if (stack.top = Max - 1) {
return false;
}
else {
stack.top++;
stack.arr[stack.top] = x;
return true;
}
}
//压出操作
bool Pop(Stack& stack,char &s) {//栈顶元素出栈用s返回
s = stack.arr[stack.top];
stack.top--;
}
//判断是否为空操作
bool Stack_Is_Empty(Stack& stack) {
if (stack.top == -1) {
return true;
}
else {
return false;
}
}
2.判断括号匹配的函数(主要注释部分)
bool test01(char* arr,int length) {
Stack S;
InitStack(S);
//循环读取字符数组的每一位数字
for (int i = 0; i < length; i++) {
//分支判断为左括号还是右括号
if (arr[i] == '(' || arr[i] == '{' || arr[i] == '[') {
//压入栈中
Push(S, arr[i]);
}
else {//说明扫描到了右括号
if (Stack_Is_Empty(S)) {//如果此时栈空,说明无法匹配
return false;
}
else {
char temp;//将出栈元素暂时保存此处
Pop(S, temp);
//这里要注意:如果思路是判断匹配,则会出现问题
//一项匹配不能返回true,需利用continue关键词,这里并不建议。
if (temp == '(' && arr[i] != ')') {
return false;
}
if (temp == '{' && arr[i] != '}') {
return false;
}
if (temp == '[' && arr[i] != ']') {
return false;
}
}
}
}
if (Stack_Is_Empty(S)) {
return true;
}
//其实可以写成return Stack_Is_Empty(S);虽然是小问题,但积少成多
}
3.注意事项
在扫描到右括号且栈不为空时,如果思路是判断匹配,则会出现问题,即一项匹配不能返回true,需利用continue关键词,会增加代码复杂度。这里并不建议。