精品课件-新编讲义对应的PPT-第三章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
后进先出(LIFO)
3.1.2栈的表示和实现
栈的存储分为顺序栈和链式栈两种 顺序栈是指栈的顺序存储结构是利用一组地址连续的存 储单元依次存放自栈底到栈顶的数据元素,同时附指针 top指示栈顶元素在顺序栈中的位置
0
12
3…
n-1
S
dat a
maaxasizae-1a 12 3 4
a n
top
一个较合理的做法是:先为栈分配一个基本容量,然后 在应用过程中,当栈的空间不够使用时再逐段扩大。 STACK_INIT_SIZE(存储空间初始分配量) STACKINCREMENT(存储空间分配增量)
否
可得到路径
(i ,j ,k)进S栈
i←u j←v
3.2栈的应用举例 表达式求值(算符优先的应用)
表达式的表示方法
波兰式
E = E1 E2θ
逆波兰式 E = θ E1 E2
E.G.
(2+X*Y)/3
波兰式: ( 2 x y * + ) 3 /
逆波兰式: / ( + 2 * x y ) 3
N*((M+4)/2)
若该通道块的四周四个方块均“不可通”,则应从 “当前路径”上删除该通道块。
回溯法的应用——马步问题
1 2 在k方向上 u=i + dx(k)
(m,n)
3
6B
4
v=j + dy(k) 3
2
5
4
1 234
1
dx 1 2 2 1
dy 2 1 -1 -2
A (1,1)
回溯法解决马步问题
AA是一个n*m 的整型矩阵, 标志(i,j)点 是否已经走 过R(u,v)是一 个函数,标志 (u,v)点是否 已经不在棋 盘范围内
波兰式: N ( ( M 4 + ) 2 / ) * 逆波兰式: * N (? / ( + M 4 ) 2 )
表达式求值(算符优先的应用)
❖表达式分为3个部分:操作数(operand)、运算符(operator) 和界限符
❖运算符——算术运算符、关系运算符和逻辑运算符
❖界限符——左右括号和表达式结束符
入栈和出栈就是表头结点的插入和删除操作
链栈为空: S->top=null
? 有链栈为满的情况出现么?
链栈的类型定义如下:
Typedef struct node
{ Elemtype data;
//数据域;
struct node * next;
//指针域;
}ListNode;
Typedef ListNode * LinkStack;
出栈时的指针变化
top base
top base A
栈空的判断: s->top = s->base
to
p
F
E
D
C
B
base A
top
E D C B base A
栈满的判断: S.top - S.base>=S.stacksize
堆栈的第二种表示方法
堆栈用数组进行表示 栈顶和栈底用整数而不是指针来表示
#define STACK_INIT_SIZE
#define STACKINCREMENT typedef struct{
SElemType SElemType int stacksize; }SqStack;
100 10;
*base *top;
Base为空则无栈结构 Top=base则表示空栈
构造一个空栈 Status initstack(sqstack &s) {
入口
出 口
回溯法的基本思想
假设“当前位置”指的是“在搜索过程中某一时刻所 在图中某个方块位置”,则求迷宫中一条路径的算法的基本思 想是:
若当前位置“可通”,则纳入“当前路径”,并继续朝 “下一位置”探索,即切换“下一位置”为“当前位置”,如 此重复直至到达出口;
若当前位置“不可通”,则应顺着“来向”退回到 “前一通道块”,然后朝着除“来向”之外的其他方向继续探 索;
Push(S,N % 8);
//取余
N = N/8; }
//取商
while ( !StackEmpty(S) ) {
Pop(S, e);
printf(“%d”,e); }
} //Conversion
3.2栈的应用举例(二) 迷宫求解
❖ 求迷宫中从入口到出口的所有路径是一个经典的程序设计问 题。
❖ 为了保证在任何位置上都能沿原路退回,显然需要用一个后 进先出的结构来保存从入口到当前位置的路径。
开始
置AA为全0; 置堆栈S为空;
i← 1 j←1
AA(i , j)← 1 k←1
k>4
否 u=i+dx(k) v=j+dy(k)
是
堆栈S为空?
否 退S(i ,j ,k) k←k+1
是
无解,结 束程序
k=k+1
是
AA(u,v)=1或者 R(u,v)越界
否
得解,一直退栈
u=m并且v=n? 是 结束 并输出其内容即
s.base=(selemtype *)malloc(STACK_INIT_SIZE *
sizeof(elemtype) ); If (!s.base) exit(overflow); s.top=s.base; s.stacksize= STACK_INIT_SIZE; Return OK;
}
入栈时的指针变化 P47算法
❖把运算符和界限符都称为算符(OP),两个相继的运算符θ1 和θ2有三种关系(θ1为栈顶元素, θ2为当前读入元素):
空栈: top=0; 满栈: top= Max (Max为数组长度上限)
进栈
开始 Top = Max
否 Top←Top + 1
E(Top)←x 结束
是 上溢
出栈
开始 Top = 0
否 y←E(Top)
是 下溢
Top←Top - 1 结束
链栈
用动态方式来存储栈可节省空间 采用链表存储的栈为链栈
…
top
LinkStack top;
//定义一个栈的栈顶指针变量
3.2栈的应用举例(一)
数制转换问题
void conversion ( ) { //对于输入的任意一个非负十进制整数, 打
制数
//印输出与其等值的八进
InitStack(S);
//构造空栈
scanf (”%d”,N);
while( N ) {
第三章 栈和队列
内容提要
栈 ❖ 存储方式 ❖ 基本操作
栈举例 队列 ❖ 队列的存储方式 ❖ 循环队列
3.1栈的概念 栈和队列也是线性表,其特殊性在于栈和队列是操作受限的线 性表。
栈是限定仅在表尾进行插入或删除的线性表。表尾称为栈顶, 表头称为栈底。
出 栈顶 栈
an .
.
.
a2
栈底
a1
入 栈
基本操作 ❖GetTop(S,&e) 返❖Pop(&S,&e) 删除栈顶元素e
3.1.2栈的表示和实现
栈的存储分为顺序栈和链式栈两种 顺序栈是指栈的顺序存储结构是利用一组地址连续的存 储单元依次存放自栈底到栈顶的数据元素,同时附指针 top指示栈顶元素在顺序栈中的位置
0
12
3…
n-1
S
dat a
maaxasizae-1a 12 3 4
a n
top
一个较合理的做法是:先为栈分配一个基本容量,然后 在应用过程中,当栈的空间不够使用时再逐段扩大。 STACK_INIT_SIZE(存储空间初始分配量) STACKINCREMENT(存储空间分配增量)
否
可得到路径
(i ,j ,k)进S栈
i←u j←v
3.2栈的应用举例 表达式求值(算符优先的应用)
表达式的表示方法
波兰式
E = E1 E2θ
逆波兰式 E = θ E1 E2
E.G.
(2+X*Y)/3
波兰式: ( 2 x y * + ) 3 /
逆波兰式: / ( + 2 * x y ) 3
N*((M+4)/2)
若该通道块的四周四个方块均“不可通”,则应从 “当前路径”上删除该通道块。
回溯法的应用——马步问题
1 2 在k方向上 u=i + dx(k)
(m,n)
3
6B
4
v=j + dy(k) 3
2
5
4
1 234
1
dx 1 2 2 1
dy 2 1 -1 -2
A (1,1)
回溯法解决马步问题
AA是一个n*m 的整型矩阵, 标志(i,j)点 是否已经走 过R(u,v)是一 个函数,标志 (u,v)点是否 已经不在棋 盘范围内
波兰式: N ( ( M 4 + ) 2 / ) * 逆波兰式: * N (? / ( + M 4 ) 2 )
表达式求值(算符优先的应用)
❖表达式分为3个部分:操作数(operand)、运算符(operator) 和界限符
❖运算符——算术运算符、关系运算符和逻辑运算符
❖界限符——左右括号和表达式结束符
入栈和出栈就是表头结点的插入和删除操作
链栈为空: S->top=null
? 有链栈为满的情况出现么?
链栈的类型定义如下:
Typedef struct node
{ Elemtype data;
//数据域;
struct node * next;
//指针域;
}ListNode;
Typedef ListNode * LinkStack;
出栈时的指针变化
top base
top base A
栈空的判断: s->top = s->base
to
p
F
E
D
C
B
base A
top
E D C B base A
栈满的判断: S.top - S.base>=S.stacksize
堆栈的第二种表示方法
堆栈用数组进行表示 栈顶和栈底用整数而不是指针来表示
#define STACK_INIT_SIZE
#define STACKINCREMENT typedef struct{
SElemType SElemType int stacksize; }SqStack;
100 10;
*base *top;
Base为空则无栈结构 Top=base则表示空栈
构造一个空栈 Status initstack(sqstack &s) {
入口
出 口
回溯法的基本思想
假设“当前位置”指的是“在搜索过程中某一时刻所 在图中某个方块位置”,则求迷宫中一条路径的算法的基本思 想是:
若当前位置“可通”,则纳入“当前路径”,并继续朝 “下一位置”探索,即切换“下一位置”为“当前位置”,如 此重复直至到达出口;
若当前位置“不可通”,则应顺着“来向”退回到 “前一通道块”,然后朝着除“来向”之外的其他方向继续探 索;
Push(S,N % 8);
//取余
N = N/8; }
//取商
while ( !StackEmpty(S) ) {
Pop(S, e);
printf(“%d”,e); }
} //Conversion
3.2栈的应用举例(二) 迷宫求解
❖ 求迷宫中从入口到出口的所有路径是一个经典的程序设计问 题。
❖ 为了保证在任何位置上都能沿原路退回,显然需要用一个后 进先出的结构来保存从入口到当前位置的路径。
开始
置AA为全0; 置堆栈S为空;
i← 1 j←1
AA(i , j)← 1 k←1
k>4
否 u=i+dx(k) v=j+dy(k)
是
堆栈S为空?
否 退S(i ,j ,k) k←k+1
是
无解,结 束程序
k=k+1
是
AA(u,v)=1或者 R(u,v)越界
否
得解,一直退栈
u=m并且v=n? 是 结束 并输出其内容即
s.base=(selemtype *)malloc(STACK_INIT_SIZE *
sizeof(elemtype) ); If (!s.base) exit(overflow); s.top=s.base; s.stacksize= STACK_INIT_SIZE; Return OK;
}
入栈时的指针变化 P47算法
❖把运算符和界限符都称为算符(OP),两个相继的运算符θ1 和θ2有三种关系(θ1为栈顶元素, θ2为当前读入元素):
空栈: top=0; 满栈: top= Max (Max为数组长度上限)
进栈
开始 Top = Max
否 Top←Top + 1
E(Top)←x 结束
是 上溢
出栈
开始 Top = 0
否 y←E(Top)
是 下溢
Top←Top - 1 结束
链栈
用动态方式来存储栈可节省空间 采用链表存储的栈为链栈
…
top
LinkStack top;
//定义一个栈的栈顶指针变量
3.2栈的应用举例(一)
数制转换问题
void conversion ( ) { //对于输入的任意一个非负十进制整数, 打
制数
//印输出与其等值的八进
InitStack(S);
//构造空栈
scanf (”%d”,N);
while( N ) {
第三章 栈和队列
内容提要
栈 ❖ 存储方式 ❖ 基本操作
栈举例 队列 ❖ 队列的存储方式 ❖ 循环队列
3.1栈的概念 栈和队列也是线性表,其特殊性在于栈和队列是操作受限的线 性表。
栈是限定仅在表尾进行插入或删除的线性表。表尾称为栈顶, 表头称为栈底。
出 栈顶 栈
an .
.
.
a2
栈底
a1
入 栈
基本操作 ❖GetTop(S,&e) 返❖Pop(&S,&e) 删除栈顶元素e