1.栈在括号匹配中的应用
算法思路:
依次扫描所有字符,遇到左括号则入栈,遇到右括号则弹出栈顶元素检查是否匹配
匹配失败的情况:
(1)栈中仍有多余的左括号
(2)栈中已经没有左括号与余下的右括号进行匹配
(3)左右括号不匹配
以顺序栈为例:
#define MAXSIZE 10
typedef struct {
char data[MAXSIZE];
int top; //栈顶指针
}SqStack; //定义一个顺序栈
void InitStack(SqStack& S) { //顺序栈的初始化
S.top = -1;
}
bool IsEmpty(SqStack S) { //顺序栈的判空
if (S.top == -1)
return true;
return false;
}
bool Push(SqStack& S,char e) { //入栈
if (S.top == MAXSIZE - 1) //栈满
return false;
S.data[++S.top] = e;
return true;
}
bool Pop(SqStack& S, char& e) { //出栈
if (S.top == -1) //空栈
return false;
e = S.data[S.top--];
return true;
}
bool BracketCheck(char str[], int length ) { //str为输入的括号字符串,length为字符串长度
SqStack S;
InitStack(S); //初始化一个栈
for (int i = 0; i < length; i++) {
if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
Push(S, str[i]); //将元素压入栈
}
else {
if (IsEmpty(S)) //扫描到右括号,且当前栈为空
return false; //匹配失败
char topelem;
Pop(S, topelem); //栈顶元素出栈
if (topelem == '(' && str[i] == ')') //如果匹配成功,则继续
continue;
else if (topelem == '[' && str[i] == ']')
continue;
else if (topelem == '{' && str[i] == '}')
continue;
else
return false; //否则直接退出
}
}
return IsEmpty(S); //检索完全部括号后,若栈为空则说明匹配成功
}
2.表达式求值问题:
(1)表达式求值问题的介绍:
我们常用的算数表达式有三种:中缀表达式、后缀表达式(逆波兰表达式)、前缀表达式(波兰表达式)
算术表达式由三部分组成:操作数、运算符、界限符