数据结构论坛

首页 » 分类 » 定义 » 数据结构栈的应用问题
TUhjnbcbe - 2021/2/24 16:31:00

栈的应用问题笔记:

栈的应用

/*

栈的应用:括号匹配的检验

假设表达式中包括圆括号和方括号,嵌套随机

例(())【()】

给定一串括号表达式,判断括号匹配

思路:

先将左括号push进栈中,然后判断栈顶元素是否与右括号相匹配,匹配则pop栈顶元素

不匹配输出不匹配提示语句,最终栈为空

类似于消消乐,即每一个新来的括号,得与栈顶的左括号相匹配或者作为新的左括号作为栈顶元素被压入

*/

/*

栈的应用:表达式的求值

例:5+6/2-3*4

由两类对象组成(数字和运算符)

不同运算符拥有不同的优先级

中缀表达式:a+b*c-d/e

后缀表达式:abc*+de/-

前缀表达式:a+b*c的写法为+a*bc

处理后缀表达式:

从左到右进行扫描,逐个处理

先push计算数,然后遇到运算符再pop出前两个数进行运算

例:62/3-42*+=

push6,2

pop2,6

came/

push6/2=3

push3

came-

pop3,3

push3-3=0

push4,2

came*

pop2,4

push2*4=8

came+

pop8,0

push8+0=8

考虑到输入问题:中缀表达式-后缀表达式

注意

1.运算数相对顺序不变

2.运算符号顺序发生变化

需要存储运算的符号(Stack)

要将当前运算符和栈顶运算符比较,比较运算符优先级

过程中:

运算数直接输出

左括号压入堆栈

右括号就将栈顶运算符pop并输出,遇到左括号则pop但不输出

运算符优先级大于栈顶运算符,则push

优先级小于栈顶运算符,则pop并输出,再比较,知道运算符优先级大于新的栈顶运算符,push

最终将堆栈内运算符全部输出

*/

/*

栈的应用:汉诺塔问题

64个盘子从小到大依次叠放,需要将其按顺序直接移动到另一个柱子上

要将x柱的盘子借助y柱移动到z柱上

n=1,x-z

n1,将n-1个盘子x-y(借助z),第n个盘子x-z

再将n-1个盘子y-z

*/

//递归代码例程

voidHanoi(intn,charx,chary,charz)

{

if(n==1)

move(x,1,z);

else{

Hanoi(n-1,x,z,y);

move(x,n,z);

Hanoi(n-1,y,x,z);

}

}

//时间复杂度:O(2^n)

/*

递归与栈

判断语句加载递归语句之前

递归的最底层应该有返回值,供上层递归调用

参量初始化在递归开始之前

递归调用需要利用堆栈

*/

/*

迷宫问题

采用“穷举求解”的思路

当前位置(标记)

终点程序结束

非终点四方向中是否存在可通过且未被标记的节点

走到该节点递归

不能通过的地方,需要进行回溯

将上次访问的位置设置为“当前位置”(栈)

typedefstruct{

intord;块的序号

PosTypeseat;块在迷宫中的坐标

intdi;下一个块的方向

}

*/

特别注意:

数据结构课本pdf网盘

1
查看完整版本: 数据结构栈的应用问题