收藏 分享(赏)

数据结构 第三章 对于栈列.ppt

上传人:无敌 文档编号:954777 上传时间:2018-05-05 格式:PPT 页数:49 大小:5.82MB
下载 相关 举报
数据结构 第三章 对于栈列.ppt_第1页
第1页 / 共49页
数据结构 第三章 对于栈列.ppt_第2页
第2页 / 共49页
数据结构 第三章 对于栈列.ppt_第3页
第3页 / 共49页
数据结构 第三章 对于栈列.ppt_第4页
第4页 / 共49页
数据结构 第三章 对于栈列.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、数据结构与算法,第3章 栈与队列,教师:王双明,教学班组成:计科2011-03,计科2011-04,2,第3章 栈和队列,栈的定义、表示和实现,1,队列的定义、表示和实现,2,3,3.1 栈(Stack),1 栈的定义,4,3.1 栈(Stack),1 栈的定义 栈是限定只能在表的一端(表尾)进行插入和删除操作的线性表 允许插入和删除的一端,称为栈顶(top);另一端则称为栈底(bottom) 向栈中插入一个新的元素称为入栈或进栈(push) 从栈中删除一个元素称为出栈或退栈(pop) 栈的删除和插入操作只能在栈顶进行,因此,栈中最先进去的元素,必定最后出栈。栈又叫做后进先出线性表(LIFO)

2、。,5,设栈的入栈序列为(e1,e2,e3),则出栈序列有多少种情况?,e1,e2,e3(e1进,e1出,e2进,e2出,e3进,e3出) e1,e3,e2(e1进,e1出,e2进,e3进,e3出,e2出) e2,e1,e3(e1进,e2进,e2出,e1出,e3进,e3出) e2,e3,e1(e1进,e2进,e2出,e3进,e3出,e1出) e3,e2,e1(e1进,e2进,e3进,e3出,e2出,e1出) e3,e1,e2(e1进,e2进,e3进,e3出,. . . .),3.1 栈,6,2 顺序栈的表示和实现 用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈顶指针top指示栈中下

3、一个元素的入栈位置;若topbase,则表示当前栈为空;,3.1 栈,7,2 顺序栈的表示和实现,#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef struct SqStack SElemType *base;SElemType *top;int stacksize;SqStack;,3.1 栈,8,2 顺序栈的表示和实现,3.1 栈,初始化空栈 建立栈空间,并且初始化栈顶指针;,9,2 顺序栈的表示和实现,3.1 栈,入栈操作 在栈顶插入一个元素,修改栈顶指针 *S.top=e;

4、 S.top+;,22,10,2 顺序栈的表示和实现,3.1 栈,出栈操作 删除栈顶元素,修改栈顶指针 S.top-; e=*S.top;,11,2 顺序栈的表示和实现 取栈顶元素取出栈顶元素,不修改栈顶指针,3.1 栈,12,2 顺序栈的表示和实现 判断栈是否空 top = base,3.1 栈,Status StackEmpty(SqStack S) /若栈空,返回1,否则,返回0if (S.top = S.base) return 1;else return 0; ,13,2 顺序栈的表示和实现对于顺序栈,需要注意:(1)出栈和取栈顶元素时,需判断是否为栈空;(2)入栈时,需注意栈满的情

5、况;,3.1 栈,14,共享栈(两个顺序栈共享一个数组),判断空栈条件:top1=0 栈1 元素进栈,top1+, 栈2 元素进栈,top2-,3.1 栈,迎面增长的栈,top1,top2,0,MAXSIZE-1,2 顺序栈的表示和实现,15,共享栈(两个顺序栈共享一个数组),#define MAXSIZE 50typedef int SElemType;typedef struct Sstack SElemType SMAXSIZE; int top1=0; top2= MAXSIZE -1; /*top1,top2 分别为两个栈的栈顶指针*/Sstack,3.1 栈,2 顺序栈的表示和实现

6、,迎面增长的栈,top1,top2,0,MAXSIZE-1,16,3 链栈的表示和实现 采用链式结构来表示栈,其结点结构同单链表。通常可采用不带头结点的链表,头指针即为栈顶指针。判断空栈的条件:top=Null,3.1 栈,17,3 链栈的表示和实现,3.1 栈,typedef struct LNodeint data;struct LNode *next; LNode, *LinkStack;,类型定义和初始化,void InitStack(LinkStack ,18,3 链栈的表示和实现,3.1 栈,typedef struct LNodeint data;struct LNode *ne

7、xt; LNode, *LinkStack;,判栈空否,int StackEmpty(LinkStack s) /若栈空,返回1,否则,返回0 if(s = NULL) return 1; else return 0;,19,3 链栈的表示和实现,3.1 栈,int Push(LinkStack ,入栈操作,入栈操作不需要判断栈是否已满。,20,3 链栈的表示和实现,3.1 栈,int Pop(LinkStack ,出栈操作,21,3 链栈的表示和实现,3.1 栈,int GetTop(LinkStack s,int ,取栈顶元素,22,【例31】栈的应用举例:数制的转换,如将十进制数转换成八

8、进制。如 169 - 251,void conversion(int x) InitStack(s); scanf(“%d”, ,3.1 栈,169,8,余1,2,8,余5,余2,21,8,0,251,23,3.2 队列,1 抽象数据类型队列的定义,24,3.2 队列,1 抽象数据类型队列的定义 队列也是受限的线性表。限定只能在队列的一端插入元素,另一端删除元素。 和栈相反,队列是一种先进先出(FIFO)的线性表。,允许删除的一端称为队头(front) 允许插入的一端称为队尾(rear) 当队列中没有元素时称为空队列,25,ADT Queue 数据对象:D=ai,aiElemset,i=1,2

9、,n,n0 数据关系:R=| ai-1, aiD,i=2,3.,n 基本操作: ADT Queue,3.2 队列,1 抽象数据类型队列的定义,(1)建立一个空队列: InitQueue(&Q)(2)判断队列是否为空:QueueEmpty(Q)(3)入队列: EnQueue (&Q,e)(4)出队列: DeQueue (&Q,&e)(5)取队头元素: GetHead (Q,&e),26,2 链队列,用带头结点的单链表头指针指向队列头,尾指针指向队列尾。,3.2 队列,27,2 链队列链式存储结构定义,3.2 队列,typedef int QElemType;,28,2 链队列-建一个空队列,3.

10、2 队列,29,2 链队列判断队列是否为空,3.2 队列,int QueueEmpty(LinkQueue Q) /若队列空,返回1,否则返回0 if (Q.front=Q.rear) return 1; else return 0;,30,2 链队列入队列,3.2 队列,31,2 链队列出队列,3.2 队列,32,2 链队列取对头元素,3.2 队列,33,顺序队列:用一组地址连续的存储单元存放队列元素。 设置两个指针front和rear分别指示队头和队尾。 约定:队头指针指向队头元素,而队尾指针指向当前队尾元素的下一个位置。,3.2 队列,3 循环队列-队列的顺序表示和实现,Queuefro

11、nt,Queuerear,34,Job 3,队列的一个应用: Job Scheduling in an Operating System,Enqueue Job 1,Enqueue Job 2,Enqueue Job 3,Dequeue Job 1,Enqueue Job 4,Enqueue Job 5,Enqueue Job 6,Dequeue Job 2,Enqueue Job 7,Enqueue Job 8 ?,Job 1,Job 2,Job 4,Job 5,Job 6,Job 7,3.2 队列,3 循环队列-队列的顺序表示和实现,front,rear,35,3.2 队列,3 循环队列-

12、队列的顺序表示和实现,Queuefront,Queuerear,队空:front = rear上溢:rear = max (假上溢),入队:rear+出队:front+,10,36,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列,将顺序队列臆造为一个环状的空间。(逻辑关系),front,rear,37,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列,将顺序队列臆造为一个环状的空间。(逻辑关系),front,rear,maxsize-1,0,38,Enqueue Job 1,Enqueue Job 2,Enqueue Job 3,Dequeue Job 1,Enqueue

13、 Job 4,Enqueue Job 5,Enqueue Job 6,Enqueue Job 7,Job1,Job2,Job3,Job4,Job5,Job6,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列,front,rear,Job7,现在front=rear 说明队列什么状态?,39,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列,front=rear 说明队列 空或满。,方法1:设置一个标志区别空和满。方法2:少用一个元素空间 (rear+1) % MAXSIZE=front,40,初始:front=0,rear=0入队:rear=(rear+1) % MAXSI

14、ZE出队:front=(front+1) % MAXSIZE队空:rear = front队满 :(rear+1) % MAXSIZE = front,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列,41,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列的实现,42,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列的实现,43,3.2 队列,3 循环队列-队列的顺序表示和实现,循环队列的实现,44,3.3 应用举例,【例33】简单表达式求值:5+10/2*3-4原理:设运算符和操作数两个栈,求解过程按下列规则: 1)依次取表达式的一个项,并进行判断: 2)若为操

15、作数,入操作数栈,转向1) 3)若为运算符,则进一步判断: (1)若其优先级大于运算符栈顶的运算符,入运算符栈,转向1) (2)若其优先级不大于运算符栈顶的运算符,则从操作数栈连续出栈两个操作数,从运算符栈出栈一个运算符,进行运算,并将结果入操作数栈;然后,将当前运算符栈顶的运算符与之比较,转向3) 4)若表达式结束,运算符栈也为空,则表达式求解结束。,【例32】括号匹配的检验,45,【例34】复杂表达式求值:a*(b+c)-d前缀表达式:运算符位于操作数前;-*a+bcd中缀表达式:运算符位于操作数中间;a*b+c-d后缀表达式:运算符位于操作数之后;abc+*d-中缀形式转换为后缀形式的特

16、点是:操作数按中缀形式出现的顺序排列,运算符按实际运算的先后次序排序并插入到相应的操作数之后;中缀形式转换为前缀形式的特点是:操作数按中缀形式出现的顺序排列,运算符按实际运算的先后次序插入到相应的操作数之前;如:a+b*3+4*(c-d),3.3 应用举例,46,利用后缀式求表达式的值: 首先将表达式转换为后缀表达式; 对后缀表达式进行求解,将表达式转换为后缀式,首先将运算符赋予一个优先级数: 运算符 # ( + - * / ) 优先级 -1 0 1 1 2 2 3,3.3 应用举例,47,因此,从原表达式求得后缀式的规则为:1) 设立运算符栈;2) 设表达式的结束符为#,预设运算符栈的栈底为

17、#;3) 若当前字符是操作数,则直接发送给后缀式;4) 若当前字符为运算符且优先数大于栈顶运算符,则进栈,否则退出栈顶运算符发送给后缀式;5) 若当前字符是结束符,则自栈顶至栈底依次将栈中所有运算符发送给后缀式;6) (对它之前后的运算符起隔离作用,则若当前运算符为(时进栈;7) )可视为自相应左括弧开始的表达式的结束符,则从栈顶起,依次退出栈顶运算符发送给后缀式直至栈顶字符为(止。,3.3 应用举例,中缀表达式后缀式的转换演示,48,如何按后缀式进行计算?,先找运算符,后找操作数运算过程为:对后缀式从左向右扫描,遇见操作数则暂时保存,遇见运算符即可进行运算;此时参加运算的两个操作数应该是在它之前刚刚碰到的两个操作数,并且先出现的是第一操作数,后出现的是第二操作数。由此可见,在运算过程中保存操作数的结构应该是个栈。,3.3 应用举例,49,栈和队列都属于受限的线性表。它们的基本操作都在端进行。栈是先进后出表,队列是先进先出表。顺序栈和链栈 链队列和循环队列,本章小结,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报