文章目录
一、栈在括号匹配中的应用
用栈实现括号匹配:
依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈项元素检
查是否匹配。
匹配失败情况:
①左括号单身②右括号单身③左右括号不匹配
代码如下:
[ main.h头文件,写栈的基本操作,如下 ]
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MaxSize 100
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;
else return false;
}
//进栈
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;
}
[.cpp文件,如下]
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include "main.h"
//遇到左括号压入栈中,遇到右括号弹出查看是否匹配
bool find(char kh[],int length,SqStack &S) {
for (int i = 0; i < length; i++) {
if (kh[i] == '(' || kh[i] == '{' || kh[i] == '[')
Push(S, kh[i]);
else {
if (IsEmpty(S))
return false;
char temp;
Pop(S, temp);
if (kh[i] == ')' && temp != '(')
return false;
if (kh[i] == '}' && temp != '{')
return false;
if (kh[i] == ']' && temp != '[')
return false;
}
}
return IsEmpty(S);
}
int main() {
char kh[] = "{()}]]";
SqStack S; //栈
InitStack(S); //初始化
if (find(kh, 4, S)=='true') printf("1");
else printf("0");
system("pause");
return 0;
}
二、栈在表达式求值中的应用
2.1 三种算数表达式
中缀表达式:常见的式子就是中缀表达式。比如:A+ B*(C-D)-E/ F
后缀表达式:
又称为逆波兰式,规则: 运算符在两个操作数后面。比如:ABCD- * +EF/-
前缀表达式:又称为波兰式,规则: 运算符在两个操作数前面。比如:-+A*B-CD/EF
注意:每个中缀表达式可能对应多个后缀表达式、前缀表达式;
2.2 后缀表达式相关考点
1. 中缀表达式转后缀表达式(手算)
由于算法具有确定性,因此要求每个中缀表达式对应唯一的后缀表达式,使用了左优先原则可以保证手算与机算一致。
注意:
这里的【左优先原则】名称 是为了更好理解而杜撰的。
2. 后缀表达式计算(手算)
3. 中缀表达式转后缀表达式(机算)
4. 后缀表达式计算(机算)
注意:
上图的【右操作数】名称 是为了更好理解而杜撰的。
2.3 中缀表达式的计算
2.4 前缀表达式相关考点
1. 中缀表达式转前缀表达式(手算)
2. 前缀表达式计算(机算)
2.5 小结
三、栈在递归中的应用