数据结构第3章

合集下载

数据结构第三章习题答案解析

数据结构第三章习题答案解析

第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。

(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。

2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。

如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。

直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。

其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

6.假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。

8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。

9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e) { Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。

数据结构(C语言)第3章 栈和队列

数据结构(C语言)第3章 栈和队列

Data Structure
2013-8-6
Page 13
栈的顺序存储(顺序栈)
利用一组地址连续的存储单元依次存放自栈底到栈顶的数 据元素。 结构定义: #define STACK_INIT_SIZE 100; // 存储空间初始分配量 #define STACKINCREMENT 10; // 存储空间分配增量 typedef struct { SElemType *base; // 存储空间基址 SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素位单位 } SqStack;
解决方案2:
顺序栈单向延伸——使用一个数组来存储两个栈
Data Structure 2013-8-6 Page 21
两栈共享空间 两栈共享空间:使用一个数组来存储两个栈,让一个 栈的栈底为该数组的始端,另一个栈的栈底为该数组 的末端,两个栈从各自的端点向中间延伸。
Data Structure
2013-8-6
链栈需要加头结点吗? 链栈不需要附设头结点。
Data Structure
2013-8-6
Page 27
栈的链接存储结构及实现
Data Structure
2013-8-6
Page 11
GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回S的栈顶元素。 Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新的栈顶元素。 Pop(&S, &e) 初始条件:栈 S 已存在且非空。 操作结果:删除 S 的栈顶元素,并用 e 返回其值。
Data Structure

数据结构课件第3章

数据结构课件第3章

0
1
2
3
4
5
6
7
a1
a2
a3
a4
a5
a6
a7
队头 F=0
队尾 R=7
a3 2 1 3 0 4 7 a3 5 6 3 a2 2 1 a1 0 F=0 a4 4 a5 5 6 a6 7 a7 R=0 R=7 3 a2 2 1 a1 0
a4 4 a5 5 6 a6 7
a8
F=0
a7
R=0
F=0
删除所有元素
top X W … B top
top=0 空栈
top
W

B A
top=m-1 元素X出栈
top
A
A
top=m 满栈
top=1 元素A入栈
例:堆栈的插入、删除操作。 出栈操作程序如下: # define m 1000; /*最大栈空间*/ 出栈操作算法: 1)栈顶指针top是否为0: typedef struct stack_stru 若是,则返回;若不是, { int s[m]; int top; }; 则执行2。 void pop (stack, y) 2)将栈顶元素送给y, struct stack_stru stack; 栈顶指针减1。 int *y; { if (stack.top = = 0) printf (“The stack is empty ! \n”); top Y Y else { top B B *y=stack.s[stack.top]; A A stack.top - -; } 出栈操作 }
top=p;
} 栈的入栈、出栈操作的时间复杂度都为O(1)。
栈的应用
一、 表达式求值 表达式由操作数、运算符和界限符组成。 运算符可包括算术运算符、关系运算符、逻辑运算符。

数据结构 课件 第3章 栈

数据结构 课件 第3章 栈
实用数据结构基础
第3章 栈
第 3 章 栈

识点
栈的定义和特点 栈的基本运算和算法 栈的典型应用


后缀表达式的算法 数制的换算 利用本章的基本知识设计相关的应用问题


掌握栈的特点 掌握栈的基本运算 熟悉栈的各种实际应用 能设计栈应用的典型算法 了解栈的运算时间复杂度分析
第3章 目录

2.顺序栈运算的基本算法 (1)置空栈 首先建立栈空间,然后初始化栈顶指针。 SeqStack *Snull( ) { SeqStack *s; s=new (SeqStack);
// 在C语言中用s=malloc(sizeof(SeqStack)) ;
s->top= –1; return s; }
3-1 栈的定义与运算 3-2 栈的存储和实现 3-3 栈的应用举例 小 结 验证性实验3: 栈子系统 自主设计实验3:后缀表达式求值 单元练习3
3-1 栈的定义和运算
3-1-1 栈(Stack)的定义
1. 栈的定义 栈是限制在表尾进行插入和删除的线性表。 进栈 出栈
an …… a3 a2 a1
图3-1栈的 示意图
3-3.
3-3-1 数制转换
栈的应用举例
数值进位制的换算是计算机实现计算和处理的 基本问题。比如将十进制数N转换为j进制的数,其 解决的方法很多,其中一个常用的算法是除j取余法。 将十进制数每次除以j,所得的余数依次入栈,然后 按“后进先出”的次序出栈便得到转换的结果。 其算法原理是: N =(N / j)* j + N % j
由于栈的操作只能在栈顶进行的,所以用链表的头部做
栈顶是最合适的。链栈结构如图3-4所示。

数据结构第三章习题答案解析

数据结构第三章习题答案解析

第三章习题1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因。

(即写出以“S”表示进栈、以“X”表示出栈的栈操作序列)。

2.设队列中有A、B、C、D、E这5个元素,其中队首元素为A。

如果对这个队列重复执行下列4步操作:(1)输出队首元素;(2)把队首元素值插入到队尾;(3)删除队首元素;(4)再次删除队首元素。

直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C3.给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4.按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+E↑F5.试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。

其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

6.假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。

8.要求循环队列不损失一个空间全部都能得到利用, 设置一个标志域tag , 以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。

9.简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ int i, n, A[255];n=0;while(!EmptyStack(S)){n++; Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}(2)void proc_2(Stack S, int e){ Stack T; int d;InitStack(&T);while(!EmptyStack(S)){ Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){ Pop(&T, &d);Push( &S, d);}}(3)void proc_3(Queue *Q){ Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){ Pop(&S, &d);EnterQueue(Q,d)}}实习题1.回文判断。

数据结构第三章字符串

数据结构第三章字符串


子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串。 子串的位置:子串的第一个字符在主串中的序号。
S1="ab12cd " S2="ab12" S3="ab13" S4="ab12φ" S5=" " S6="φφφ "

串的比较:通过组成串的字符之间的比较来进行的。
给定两个串:X="x1x2…xn"和Y="y1y2…ym",则: 1. 当n=m且x1=y1,…,xn=ym时,称X=Y; 2. 当下列条件之一成立时,称X<Y: ⑴ n<m且xi=yi(1≤ i≤n); ⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。 例:S1="ab12cd ",S2="ab12",S3="ab13"

例:主串S="ababcabcacbab",模式T="abcac"
i
第 4 趟
a b a b c a b c a c b a b a b c a c
j
i=4,j=1失败 i回溯到5,j回溯到1
Hale Waihona Puke 串例:主串S="ababcabcacbab",模式T="abcac"
i
第 5 趟
a b a b c a b c a c b a b a b c a c
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。

大学数据结构课件--第3章 栈和队列

top top 栈空 F E D C B A
栈满 top-base=stacksize
top
F
E
D C B
top top top top top top base
入栈PUSH(s,x):s[top++]=x; top 出栈 POP(s,x):x=s[--top]; top
base
4
A
3.1 栈
例1:一个栈的输入序列为1,2,3,若在入栈的过程中 允许出栈,则可能得到的出栈序列是什么? 答: 可以通过穷举所有可能性来求解:
3.2 栈的应用举例
二、表达式求值
“算符优先法”
一个表达式由操作数、运算符和界限符组成。 # 例如:3*(7-2*3) (1)要正确求值,首先了解算术四则运算的规则 a.从左算到右 b.先乘除后加减 c.先括号内,后括号外 所以,3*(7-2*3)=3*(7-6)=3*1=3
9
3.2 栈的应用举例
InitStack(S); while (!QueueEmpty(Q))
{DeQueue(Q,d);push(S,d);}
while (!StackEmpty(S)) {pop(S,d);EnQueue(Q,d);} }
第3章 栈和队列
教学要求:
1、掌握栈和队列的定义、特性,并能正确应用它们解决实 际问题;
用一组地址连续的存储单元依次存放从队头到队尾的元素, 设指针front和rear分别指示队头元素和队尾元素的位置。
Q.rear 5 4 Q.rear 3 2 3 2 5 4 Q.rear 3 3 5 4 5 4
F E D C
C B A
Q.front
2 1 0
C B
Q.front 2 1 0

《数据结构(C语言)》第3章 栈和队列

Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(1) 栈的静态分配顺序存储结构描述 ② top为整数且指向栈顶元素 当top为整数且指向栈顶元素时,栈空、入栈、栈满 及出栈的情况如图3.2所示。初始化条件为 S.top=-1。
(a) 栈空S.top==-1 (b) 元素入栈S.stack[++S.top]=e (c) 栈满S.top>=StackSize-1 (d) 元素出栈e=S.stack[S.top--]
/*栈顶指针,可以指向栈顶
元素的下一个位置或者指向栈顶元素*/
int StackSize; /*当前分配的栈可使用的以 元素为单位的最大存储容量*/
}SqStack;
/*顺序栈*/
Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(2) 栈的动态分配顺序存储结构描述 ① top为指针且指向栈顶元素的下一个位置 当top为指针且指向栈顶元素的下一个位置时,栈空 、入栈、栈满及出栈的情况如图3.3所示。初始化条 件为S.top=S.base。
…,n-1,n≥0} 数据关系:R={< ai-1,ai>| ai-1,ai∈D,i=1,2
,…,n-1 } 约定an-1端为栈顶,a0端为栈底 基本操作:
(1) 初始化操作:InitStack(&S) 需要条件:栈S没有被创建过 操作结果:构建一个空的栈S (2) 销毁栈:DestroyStack(&S) 需要条件:栈S已经被创建 操作结果:清空栈S的所有值,释放栈S占用的内存空间
return 1;
}
Data structures

数据结构第3章栈

Elemtype pop(sqstack *s) { /*若栈s不为空,则删除栈顶元素*/ Elemtype x; if(s->top<0) return NULL; /*栈空*/ x=s->stack[s->top]; s->top--; return x; }
13
(4)取栈顶元素操作
Elemtype gettop(sqstack *s) { /*若栈s不为空,则返回栈顶元素*/ If(s->top<0) return NULL; /*栈空*/ return (s->stack[s->top]); }

29
算术表达式求值
在计算机中,任何一个表达式都是由: 操作数(operand)、运算符(operator)和 界限符(delimiter)组成的。 其中操作数可以是常数,也可以是变量或常量的 标识符;运算符可以是算术运算体符、关系运算符和 逻辑符;界限符为左右括号和标识表达式结束的结束 符。
30
6
存储结构
栈是一种特殊的线性表,有两种存储方式: 顺序存储结构存储
链式存储结构存储。


7
顺序栈的数组表示
与第二章讨论的一般的顺序存储结构的线性表 一样,利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,这种形式的栈也称为顺 序栈。 使用一维数组来作为栈的顺序存储空间。 设指针top指向栈顶元素的当前位置,以数组 小下标的一端作为栈底。 top=0时为空栈,元素进栈时指针top不断地 加1,当top等于数组的最大下标值时则栈满。
5)假如读出的运算符的优先级不大于运算符栈栈顶运算符
的优先级,则从操作数栈连续退出两个操作数,从运算符栈中 退出一个运算符,然后作相应的运算,并将运算结果压入操作 数栈。此时读出的运算符下次重新考虑(即不读入下一个符号 )。

数据结构 第3章 中缀表达式

数据结构实验报告(第三章)实验类型:综合性实验班级:学号:姓名:实验日期:2014年5月24日一、表达式求值1.问题描述表达式是数据运算的基本形式。

人们的书写习惯是中缀式,如:11+22*(7-4)/3。

中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。

表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。

后缀表达式和前缀表达式中没有括号,给计算带来方便。

如后缀式计算时按运算符出现的先后进行计算。

本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。

2.基本要求●从文件或键盘读入中缀表达式。

●设计操作数为多位整数,操作符为加、减、乘、除、求模的中缀表达式求值算法。

●设计将中缀表达式转换为后缀表达式的算法。

●设计将中缀表达式转换为前缀表达式的算法。

●设计后缀表达式求值算法。

●设计前缀表达式求值算法。

●输出各种形式的表达式。

3.数据结构设计任何一个表达式都是由操作符,运算符和界限符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

typedef struct{int *base;int *top;int numstacksize; //数字栈}numstack;typedef struct{char *base;char *top;int charstacksize;//字符栈}charstack;4.算法设计(1)中缀表达式求值1.从左到右读入中缀表达式,每次一个字符。

2.如果是操作数,压入操作数栈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第 三 章 栈和队列
3.2 栈的应用
(3)后缀表达式求值步骤: a.读入表达式一个字符 b.若是操作数,压入栈,转d c.若是运算符,从栈中弹出2个数,将运算结果再压入栈 d.若表达式输入完毕,栈顶即表达式值; 若表达式未输入完,转a 例 计算 4+3*5 后缀表达式:435*+
top top top top 3 4 5 3 7 top 15 4 top
第 三 章 栈和队列
3.1 栈
2.栈的抽象数据类型定义 ADT Stack{ 数据对象:D={ ai| ai∈ElemSet, i=1, …, n, n>=0} 数据关系:R1={<ai-1, ai>|ai-1, ai∈D, i=2 ,…, n } 基本操作: InitStack(&S) DestroyStack(&S) //建空栈 //撤消栈
第 三 章 栈和队列
3.3 栈与递归的实现
5.Tower of Hanoi问题 – 问题描述:有X,Y,Z三个塔座,X上套有n个直径不同的 圆盘,按直径从小到大叠放,形如宝塔,编号1,2,3……n。 要求将n个圆盘从X移到Z,叠放顺序不变,移动过程中 遵循下列原则: • 每次只能移一个圆盘 • 圆盘可在三个塔座上任意移动 • 任何时刻,每个塔座上不能将大盘压到小盘上 –解决方法: • n=1时,直接把圆盘从X移到Z • n>1时,先把上面n-1个圆盘从X移到Y,然后将n号盘 从X移到Z,再将n-1个盘从Y移到Z。即把求解n个圆盘 的Hanoi问题转化为求解n-1个圆盘的Hanoi问题,依 次类推,直至转化成只有一个圆盘的Hanoi问题
3.2 栈的应用
(2)中缀表达式转为后缀表达式 设中缀表达式和后缀表达式分别在 向量IFX和PFX中,用栈S实现中缀式转 为后缀式,对IFX中表达式从左到右扫描, 设TOKEN是扫描读到的符号,转换算法 可描述如下: • 栈初始化。 • 从左到右扫描向量IFX,重复下述两步 操作,直到表达式尾。 ① 从IFX中取出下个TOKEN(数字、运 算符、左括号、右括号);
4.表达式求值 概念 – 前缀表达式 : +a b – 中缀表达式 : a+b – 后缀表达式 : a b+ 中缀表达式 后缀表达式(逆波兰表达式) a*b+c ab*c+ a+b*c abc*+ a+(b*c+d)/e abc*d+e/+ 算符:运算符和界符。 算符的优先关系:<、=、> (见表3.1) 这里重点介绍中缀表达式、后缀表达式求值。
4
19
第 三 章 栈和队列
3.3 栈与递归的实现
当一个函数在运行期间调用另一个函数时,在运行该 被调用函数之前,需先完成三件事:
将所有的实在参数、返回地址等信息传递给被调用函数保存
为被调用函数的局部变量分配存储区
将控制转移到被调用函数的入口
而从被调用函数返回调用函数之前,应该完成:
第 三 章 栈和队列 例:扫描 A+B*C-D/(E+F)#
进栈 „+‟>‟#‟ ’ *’ >’+’ C B A
操作数
3.2 栈的应用
遇"-" <"*"
运算符 进栈
* + #
做B*C并进栈
B*C A
操作数
运算符
+ #
"-"<"+B*C
操作数
运算符
#
F E ‘+’ > ‘( ‘ ‘(‘ > ’/’ D ’/’ > ’-‘ A+B*C
理解递归算法执行过程中栈的状态变化过程。
重点和难点
掌握栈和队列这两种结构的特点,以便能在应用问题 中正确使用
知识点 顺序栈、链栈、循环队列、链队列
第 三 章 栈和队列 栈和队列是在程序设计中被广泛使用的两种线性数 据结构,它们的特点在于基本操作的特殊性,栈必须按 “后进先出”的规则进行操作,而队列必须按“先进先 出”的规则进行操作。和线性表相比,它们的插入和删 除操作受更多的约束和限定,故又称为限定性的线性表 结构。线性表和栈及队列的插入和删除操作的主要区别 : • 线性表允许在表内任一位置进行插入和删除 • 栈只允许在表尾一端进行插入和删除 • 队列只允许在表尾一端进行插入,在表头一端进 行删除
第 三 章 栈和队列
3.1 3.2 3.3 3.4
本章说明 栈 栈的应用举例 栈与递归的实现 队 列 本章小结
返回主目录
第 三 章 栈和队列
学习目标
本章说明
掌握栈和队列这两种抽象数据类型的特点,并能在相 应的应用问题中正确选用它们 熟练掌握栈类型的两种实现方法 熟练掌握循环队列和链队列的基本操作实现算法
‘-’ > # 操作数
+ ( / #
运算符
第 三 章 栈和队列
F 遇’)‟ < ‟+‟ E D A+B*C
操作数
3.2 栈的应用
+ ( / #
做E+F
E+F D A+B*C
操作数
运算符
运算符
( / #
’ ) ’ = ’( ‘ 脱括号
„#‟<„/‟
E+F D A+B*C
操作数
‘做D/(E+F)
运算符
保存被调函数的计算结果 释放被调函数的数据区
依照被调函数保存的返回地址将控制转移到调用函数
由于函数的运行规则是:后调用先返回,因此各函数 占有的存储管理应实行"栈式管理"
第 三 章 栈和队列 1. 过程的嵌套调用
子 过 程 1
3.3 栈与递归的实现
r
主 程 序
r
s
s r t
子 过 程 2
第 三 章 栈和队列 1.栈的定义和特点
3.1 栈
定义:限定仅在表尾进行插入或删除操作的线性表, 表尾—栈顶,表头—栈底,不含元素的空表称空栈 特点:先进后出(FILO)或后进先出(LIFO)
基本操作:
• 插入 • 删除 • 初始化 • 取栈顶元素 • 判空等
栈底 进栈 栈顶 出栈 ... an ……... a2 a1 栈s=(a1,a2,……,an)
top top top top top top
(1 ) 3 (1)w=3
(2) 2 (2)w=2 (1) 3 (1)w=3
(3) 1 (3)w=1 (2) 2 (2)w=2 (1) 3 (1)w=3
(4)w=0 (4) 0 (3)w=1 (3) 1 (2)w=2 (2) 2 (1)w=3 (1) 3
第 三 章 栈和队列
栈顶的 刚读入的 表 3.1 算符间的优先关系
3.2 栈的应用
第 三 章 栈和队列
3.2 栈的应用
(1)中缀表达式求值:操作数栈和运算符栈 算法思想 ①设置两个工作栈,运算符栈OPTR 和操 作数栈OPND。操作数栈也放表达式的运算 结果; ②置操作数栈为空栈,置运算符栈的栈底 为表达式的起始符#; ③自左向右扫描表达式(即每次读一个字 符);
例 把十进制数159转换成八进制数
8 159
余7
余3 top top 2 3 7
top top 3 7
8 19 8 2 0
余2
7
2 3 7
(159)10=(237)8
算法:
3.1
第 三 章 栈和队列
3.2 栈的应用
3.行编辑程序 功能:接受用户从终端输入的程序和数据,并存 入数据区。 允许用户输入出错,如发现刚输入的一个字符 错时,可补进一个退格符“#”,表示前一个字符 无效;如果发现当前输入的行内差错较多或难以补 救,则可以键入一个退行符“@”,表示当前行中 字符均无效。 如:whli##ilr#e(s#*s) outcha@putchar(*s=#++); 是:while(*s) putchar(*s++);
/ #
D/(E+F) A+B*C
操作数 运算符
#
第 三 章 栈和队列
3.2 栈的应用
‘#‟<‟/‟
‘#‟<‟/‟
做D/(E+F)
D/(E+F) A+B*C
操作数 运算符
#
做A+B*CD/(E+F)
A+B*C-D/(E+F)
操作数
运算符
#
‘#‟=„#‟
操作数出栈
即计算结果
•算法
3.4
第 三 章 栈和队列
}ADT Stack
第 三 章 栈和队列
3.1 栈
3.栈的表示和实现
• 顺序栈
(1)栈的存储结构
栈满
5
– 实现:一维数组s[M] top top F 5 top E 4 top D 3 top 2 C
栈空
top top
top top F E D C B A 出栈 5 4 3 2 1 0
4 3
2 1 0
t s r
子 过 程 3
r
s r
第 三 章 栈和队列
3.3 栈与递归的实现
2. 递归过程及其实现 – 递归:函数直接或间接的调用自身叫递归 – 实现:建立递归工作栈
例 递归的执行情况分析
void print(int w) { int i; if ( w!=0) { print(w-1); for(i=1;i<=w;++i) printf(“%3d,”,w); printf(“/n”); } }
0
栈1底 栈1顶 栈2顶
相关文档
最新文档