【精品数据结构课件】栈和队列_第1页
【精品数据结构课件】栈和队列_第2页
【精品数据结构课件】栈和队列_第3页
【精品数据结构课件】栈和队列_第4页
【精品数据结构课件】栈和队列_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/9/10,1,第3章 栈和队列,本章主题:栈和队列的应用 教学目的:掌握栈和队列的应用方法,理解栈的重要作用 教学重点:利用栈实现行编辑,利用栈实现表达式求值 教学难点:利用栈实现表达式求值,栈,也叫堆栈,是最常用也是最重要的数据结构之一。比如编译器中的语法识别、数学表达式的处理、程序运行中的函数及过程的调用等,都要用到栈的有关特性。它们是栈应用于实际问题的典型。,3.1 栈,2020/9/10,2,1栈的定义 栈是一种特殊的线性表,插入或删除栈元素的运算只能在表的一端进行,称运算的一端为栈顶,另一端称为栈底。 特点:后进先出 栈又称为“后进先出”的线性表,简称LIFO表。,3.1.

2、1 栈的定义和运算,2020/9/10,3,2栈的基本运算 初始化栈InitStack(S) 设置一个空栈S。 压栈Push(S,x) 将元素x插入栈S中,使x成为栈S的栈顶元素。 出栈Pop(S,x) 当栈S不空时,由x返回栈顶元素,并从栈中删除栈顶元素 取栈顶元素GetTop(S,x) 若栈S不空,则由x返回栈顶元素。 判栈空Empty(S) 若栈S为空栈,结果为1,否则结果为0。,2020/9/10,4,3.1.2 栈的顺序存储结构及其基本运算的实现 栈有两种存储表示方法:顺序存储和链式存储 1.栈的顺序存储结构 栈的顺序存储结构简称为顺序栈。通常由一个一维数组和一个记录栈顶元素位置的变

3、量组成。,2020/9/10,5,ElemType 为栈中元素的数据类型,可以根据需要而指定为某种具体的类型。 data域:为一个一维数组,用于存储栈中元素。 top域:栈顶指针。取值范围为0MaxSize-1。 top=-1表示栈空,top=MaxSize-1表示栈满。,#define MaxSize typedef struct ElemType dataMaxSize; int top; STACK;,顺序栈的C语言描述如下:,2020/9/10,6,。,顺序栈的几种状态(最大长度MaxSize为4),(a)当栈中没有数据元素时,表示为栈空。栈顶元素所对应的下标值top=-1。 (b)表

4、示在(a)基础上执行Push(S, A)后得到这种状态。 (c)又有三个元素B、C、D先后入栈,此时栈顶元素的下标值top=3。栈已满。 (d)表示在(c)状态下,执行一次Pop(S,x)运算得到。 (e)表示在(d)状态下,执行三次Pop(S,x)运算得到。此时栈顶下标值top=-l,又变成栈空状态,2020/9/10,7,2基本运算在顺序存储结构的实现 初始化栈InitStack(S) void InitStack(STACK *S) S-top=-1; 压栈Push(S,x),int Push(STACK *S,ElemType x) if(S-top=MaxSize-1) printf

5、(n Stack is full!); return 0; S-top+; S-dataS-top=x; return 1; ,2020/9/10,8,出栈Pop(S,x),int Pop(STACK *S,ElemType *x) if(Empty(S) printf(n Stack is free!); return 0; *x=S-dataS-top; S-top-; return 1; ,2020/9/10,9,取栈顶元素GetTop(S,x),int GetTop(STACK *S, ElemType *x) if(Empty(S) printf(n Stack is free!);

6、 retrn 0; *x=S-dataS-top; return ,判栈空Empty(S) int Empty(STACK *S) return (S-top=-1?1:0);,2020/9/10,10,3栈的共享存储单元 两个栈共享大小为m的内存空间时,分配方法的示意图如下,两个栈的共享存储单元可用C语言描述如下: #define MaxSize typedef struct ElemType dataMaxSize; int top2; STACK;,2020/9/10,11,(1)两个栈共享存储单元的压栈算法,int Push(STACK *S,ElemType x,int k) if(

7、S-top0+1=S-top1) printf(n stack is full!); return 0; if(k=0) S-top0+; S-dataS-top0=x; else S-top1-; S-dataS-top1=x; return 1; ,2020/9/10,12,(2)两个栈共享存储单元的出栈算法,int Pop(STACK *S,int k,ElemType *x) if(k=0) ,2020/9/10,13,3.1.3 栈的链式存储结构及其基本运算的实现 1.栈的链式存储结构 栈的链式实现是以链表作为栈的存储结构,并在这种存储结构上实现栈的基本运算。栈的链式实现称为链栈,链

8、栈的C语言描述如下: typedef struct snode /定义链栈结点类型 ElemType data; struct snode *next; LinkSTACK; LinkSTACK *top;,链栈结构示意图,2020/9/10,14,链栈的几种状态 :,2020/9/10,15,2基本运算在链式存储结构的实现 栈初始化 void InitStack(LinkSTACK *top) *top=(LinkSTACK*)malloc(sizeof(LinkSTACK); (*top)-next=NULL; ,2020/9/10,16,压栈运算,int Push(LinkSTACK *

9、top,ElemType x) LinkSTACK *s; s=(LinkSTACK *)malloc(sizeof(LinkSTACK); s-data=x; s-next=(*top)-next; (*top)-next=s; return 1; ,判断栈空 int Empty(LinkSTACK *top) return (*top)-next=NULL?1:0);,2020/9/10,17,出栈运算,int Pop(LinkSTACK *top,ElemType *x) LinkSTACK *s; if(Empty(top) printf(n stack is free!); retu

10、rn 0; s=(*top)-next; *x=s-data; (*top)-next=s-next; free(s); return 1; ,2020/9/10,18,取栈顶元素,int GetTop(LinkSTACK *top,ElemType *x) if(Empty(top) printf(n stack is free!); return 0; *x=(*top)-next-data; return 1; ,2020/9/10,19,“算符优先法” 的基本思想: (1)操作数栈置为空栈,表达式起始符“#”为运算符栈的栈底元素。 (2)从左到右扫描表达式,依次读入表达式中每个字符。若

11、所读字符为“#”,且操作符的栈顶元素也为“#”时,则输出操作数栈中的栈顶数据,即为运算的结果,结束处理。否则,进行下面处理。 (3)若为操作数,入操作数栈;若为操作符,则要将当前操作符和操作符栈中的栈顶操作符进行优先级比较。,3.2 栈的应用,2020/9/10,20, 如果当前操作符的优先级大于栈顶操作符的优先级,则将当前操作符压人操作符栈中;转第(2)步。 如果当前操作符的优先级等于栈顶操作符的优先级,则将当前操作符栈顶的操作符出栈。转第(2)步。 如果当前操作符的优先级小于栈顶操作符的优先级,将当前操作符栈顶的操作符出栈。并从操作数栈中顺次出栈两个操作数(先退出作为运算符的右操作数,后退

12、出作为运算符的左操作数)。用刚出栈的操作符对两个操作数进行计算求值,将所得值压入操作数栈中。转第(3)步。,2020/9/10,21,下图展示了算术表达式3(7-2)求值的动态过程,2020/9/10,22,中缀表达式转换为等价的后缀表达式,中缀表达式 等价后缀表达式 0.3(52+1) 0.3 5 21+/ 16-9(4+3) 16 9 4 3+- 2(x+y)/(1-x) 2 x y +1 x-/ (25+x) (a(a+b)+b) 25 x+a a b+b+,2020/9/10,23,递归是一种非常重要的数学概念和解决问题的方法,在计算机科学和数学等领域有着广泛的应用。在计算机科学中,许

13、多数据结构,如广义表、树和二叉树等,由于其自身固有的递归性质,都可通过递归方式加以定义并实现许多问题的算法设计。在计算机内部,通过栈来实现递归算法。所以递归是栈的一个实际应用。,3.3 栈与递归,2020/9/10,24,采用递归算法求解正整数n的阶乘n! 数学定义,求n的阶乘的递归函数算法如下: long fact(int n) long f; if(n=0) f=1; else f=n*fact(n-1); return f; ,2020/9/10,25,进行fact(4)调用的系统栈的变化情况,2020/9/10,26,函数fact(4)的递归调用过程的执行流程,2020/9/10,27

14、,3.4.1 队列的定义和运算 1队列的定义 队列也是一种运算受限的线性表。在这种线性表上,插入限定在表的某一端进行,删除限定在表的另一端进行。允许插入的一端称为队尾,允许删除的一端称为队头。 特点:队列中数据元素的入队和出队过程是按照“先进先出” 的原则进行的。因此,队列又称为“先进先出”的线性表,简称FIFO表。,3.4 队列,2020/9/10,28,2队列的基本运算 队列初始化InitQueue(SQ) 设置一个空队列SQ。 入队列EnQueue(SQ,x) 将x插入到队列SQ的队尾。 出队OutQueue(SQ,x) 将队头元素赋给x,并删除队头元素。 取队头元素GetHead(SQ

15、,x) 由x返回队头结点的值。 判队列空Empty (SQ) 队列SQ是否为空。若为空返回1,否则返回0。,2020/9/10,29,3.4.2 队列的顺序存储结构及其基本运算的实现 队列有两种存储表示方法:顺序存储和链式存储 1队列的顺序存储结构 队列的顺序存储结构简称顺序队。 顺序队是用一维数组依次存放队列中的元素和分别指示队列的首端和队列的尾端的两个变量组成。这两个变量分别称为“队头指针”和“队尾指针”。,顺序队列的数据类型定义如下,#define MaxSize typedef struct ElemType dataMaxSize; int front,rear; SQUEUE;,2

16、020/9/10,30,顺序队列( MaxSize=5 )的几种状态,(a)表示空队列, rear=front=0。 (b)元素A入队后, rear=1,front=0。 (c)B,C依次入队后, rear=3,front=0。 (d)A,B,C依此出队后, rear=front=3。 (e)D入队后,rear=4, front=3。 (f)D出队后,rear=front=4。,2020/9/10,31,如图所示是具有五个存储单元的循环队列,(a)表示空队列, rear= front=0。 (b)元素A入队后, rear=1, front=0。 (c)B,C,D依次入队后, rear=4, f

17、ront=0。 (d)A出队后, front=1 ,rear=4。 (e)B,C,D出队后, rear= front=4。,2020/9/10,32,2基本运算顺序队列的实现 队列初始化 void InitQueue(SQUEUE *SQ) SQ-rear=SQ-front=0;,入队列 int EnQueue(SQUEUE *SQ,ElemType x) if(SQ-rear+1)%MaxSize=SQ-front) printf(n Queue is full!); return 0; SQ-rear=(SQ-rear+1)%MaxSize; SQ-dataSQ-rear=x; retur

18、n 1;,2020/9/10,33,出队 int OutQueue(SQUEUE *SQ,ElemType *x) if(Empty(SQ) printf(n Queue is free); return 0; SQ-front=(SQ-front+1)%MaxSize; *x=SQ-dataSQ-front; return 1; ,判队列空 int Empty(SQUEUE *SQ) return(SQ-rear=SQ-front)?1:0;,2020/9/10,34,3.4.3队列的链式存储结构及其基本运算的实现 1. 队列的链式存储结构 队列的链式存储结构简称为链队。它实际上是一个同时带

19、有首指针和尾指针的单链表。头指针指向表头结点,而尾指针则指向队尾元素。 链队结构示意图,2020/9/10,35,链队的数据类型定义如下 :,typedef struct qnode /链队结点的类型 ElemType data; struct qnode *next; QTYPE; typedef struct qptr /链队指针类型 QTYPE *front,*rear; SQUEUE; SQUEUE LQ;,2020/9/10,36,链队运算指针变化情况,2020/9/10,37,2基本运算链队的实现 队列初始化,void InitQueue(SQUEUE *LQ) QTYPE *p; p=(QTYPE *)mall

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论