数据结构栈和队列课件.ppt
《数据结构栈和队列课件.ppt》由会员分享,可在线阅读,更多相关《数据结构栈和队列课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构课程的内容数据结构课程的内容3.1 栈(栈(Stack)第三章第三章 栈和队列栈和队列3.2 队列队列(Queue)1.定义定义2.逻辑结构逻辑结构3.存储结构存储结构4.运算规则运算规则5.实现方式实现方式1.定义定义2.逻辑结构逻辑结构3.存储结构存储结构4.运算规则运算规则5.实现方式实现方式1.定义定义3.1 栈栈与同线性表相同,仍为一对一关系。与同线性表相同,仍为一对一关系。用顺序栈或链栈存储均可,但以顺序栈更常见用顺序栈或链栈存储均可,但以顺序栈更常见只能在栈顶只能在栈顶(表尾表尾)运算,且访问结点时依照后运算,且访问结点时依照后进先出(进先出(LIFO)或先进后出()或先
2、进后出(FILO)的原则。)的原则。关键是编写入栈和出栈函数,具体实现依顺关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。序栈或链栈的不同而不同。基本操作有入栈、出栈、读栈顶元素值、建基本操作有入栈、出栈、读栈顶元素值、建栈、或判断栈满、栈空等。栈、或判断栈满、栈空等。3.存储结构存储结构4.运算规则运算规则5.实现方式实现方式 2.逻辑结构逻辑结构限定只能在表的一端进行插入和删除运算的限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)线性表(只能在栈顶操作)问:堆栈是什么?它与一般线性表有什么不同?问:堆栈是什么?它与一般线性表有什么不同?3.1 栈栈答:答:堆栈是
3、一种特殊的线性表,它只能在表的一端堆栈是一种特殊的线性表,它只能在表的一端(即栈顶)进行插入和删除运算。(即栈顶)进行插入和删除运算。与一般线性表的区别:仅在于运算规则不同。与一般线性表的区别:仅在于运算规则不同。一般线性表一般线性表 堆栈堆栈逻辑结构:一对一逻辑结构:一对一 逻辑结构:一对一逻辑结构:一对一存储结构:顺序表、链表存储结构:顺序表、链表 存储结构:顺序栈、链栈存储结构:顺序栈、链栈运算规则:随机存取运算规则:随机存取 运算规则:后进先出运算规则:后进先出(LIFO)“进进”压入压入=PUSH(x)“出出”弹出弹出=POP(y)栈栈 是仅在是仅在表尾表尾进行插入、删除操作的线性表
4、。进行插入、删除操作的线性表。表尾表尾(即即 an 端端)称为称为栈顶栈顶 top;表头表头(即即 a1 端端)称为称为栈底栈底base例如:例如:栈栈 s=(a1 ,a2 ,a3 ,.,an-1 ,an)a1 称为称为 栈底元素栈底元素 an 称为称为 栈顶元素栈顶元素插入元素到插入元素到栈顶栈顶(即表尾)的操作,称为(即表尾)的操作,称为入栈入栈。从从栈顶栈顶(即表尾)删除最后一个元素的操作,称为(即表尾)删除最后一个元素的操作,称为出栈出栈。教材教材P44P44对对栈栈有更详细定义:有更详细定义:强调:强调:插入和删除都只能在表的一端(栈顶)进行!插入和删除都只能在表的一端(栈顶)进行!
5、顺序栈示意图顺序栈示意图s a1 a2 a3data a4(栈底栈底)(栈顶栈顶)99.3210top a1 a2 an顺序栈顺序栈S ai表和栈的操作区别表和栈的操作区别对线性表对线性表 s=(a1 ,a2 ,.,an-1,an)表头表头表尾表尾栈底栈底base栈顶栈顶top低地址低地址高地址高地址写入:写入:vi=ai读出:读出:x=vi压入:压入:PUSH(an+1)弹出:弹出:POP (x)前提:一定要预设栈顶指针前提:一定要预设栈顶指针top!低地址低地址高地址高地址vi a1 a2 ai an 顺序表顺序表Vn an+1入栈操作入栈操作例如用堆栈存放(例如用堆栈存放(A A,B B
6、,C C,D D)(注意要遵循(注意要遵循“后进先出后进先出”原则)原则)AACBABAtop核心语句:核心语句:top=L;顺序栈中的顺序栈中的PUSHPUSH函数函数status Push(ElemType x)if(topM)上溢 else vtop+top+=x;Push(B);Push(C);Push(D);toptoptoptop低地址低地址LPush(A);高地址高地址MBCD 出栈操作出栈操作例如从栈中取出例如从栈中取出B B (注意要遵循(注意要遵循“后进先出后进先出”原则)原则)DCBAtoptopDCABDCBAtopDCBAtoptop低地址低地址L高地址高地址MD核心
7、语句:核心语句:Pop();Pop();Printf(Pop();顺序栈中的顺序栈中的POPPOP函数函数status Pop()status Pop()if(top=L)if(top=L)下溢下溢 else y=velse y=v-top-top;return(y);return(y);例例1:一个栈的输入序列是一个栈的输入序列是12345,若在入栈的过,若在入栈的过程中允许出栈程中允许出栈,则栈的输出序列则栈的输出序列43512可能实现可能实现吗?吗?12345的输出呢?的输出呢?43512不不可可能能实实现现,主主要要是是其其中中的的12顺顺序序不不能能实现;实现;12345的输出可以实
8、现,只需压入一个立即弹的输出可以实现,只需压入一个立即弹出一个即可。出一个即可。435612中到了中到了12顺序不能实现;顺序不能实现;135426可以实现。可以实现。例例2:如果一个栈的输入序列为如果一个栈的输入序列为123456,能否得,能否得到到435612和和135426的出栈序列?的出栈序列?答:答:答:答:例例3(严题集(严题集3.1)一个栈的输入序列为一个栈的输入序列为123,若在,若在入栈的过程中允许出栈,则可能得到的出栈序列是入栈的过程中允许出栈,则可能得到的出栈序列是什么?什么?答:答:可以通过穷举所有可能性来求解:可以通过穷举所有可能性来求解:1 1入入1 1出,出,2
9、2入入2 2出,出,3 3入入3 3出,出,即即123123;1 1入入1 1出,出,2 2、3 3入入3 3、2 2出,出,即即132132;1 1、2 2入,入,2 2出,出,3 3入入3 3出,出,即即231231;1 1、2 2入,入,2 2、1 1出,出,3 3入入3 3出,出,即即213213;1 1、2 2、3 3入,入,3 3、2 2、1 1出,出,即即321321;合计有合计有5 5种可能性。种可能性。补充补充1:若入栈动作使地址向高端增长,称为若入栈动作使地址向高端增长,称为“向上生成向上生成”的栈;的栈;若入栈动作使地址向低端增长,称为若入栈动作使地址向低端增长,称为“向
10、下生成向下生成”的栈;的栈;对于向上生成的栈对于向上生成的栈入栈入栈口诀:堆栈指针口诀:堆栈指针top先压后加(先压后加(vvtop+top+=x=x););出栈出栈口诀:堆栈指针口诀:堆栈指针top先减后弹(先减后弹(y=vy=v-top-top)。3.1 栈栈补充补充2:栈不存在的条件:栈不存在的条件:base=NULL;栈为空栈为空 的条件的条件:base=top;栈满的条件栈满的条件 :top-base=stacksize;补充补充3:链栈:链栈 链栈示意图链栈示意图s(栈底栈底)(栈顶栈顶)topa3a2a4a1链栈的入栈函数、出栈函数链栈的入栈函数、出栈函数(以头指针为栈顶,在头指
11、针处插入或删除!)(以头指针为栈顶,在头指针处插入或删除!)公共说明部分:公共说明部分:typedef struct snode SElemType data;struct snode*link;NODE;NODE *st,*p;int m=sizeof(NODE);Push(SElemType x)p=(NODE*)malloc(m);if(!p)上溢上溢else p-data=x;p-link=st;st=p;S Status pop()pop()if(st=NULL)if(st=NULL)下溢下溢 elsey=st-data;p=st;st=st-link;elsey=st-data;p
12、=st;st=st-link;free(p);return(y);free(p);return(y);链栈链栈入栈入栈函数函数链栈链栈出栈出栈函数函数插入插入表头表头从表头从表头删除删除 链栈不必设头结点,因为栈顶(表头)操作链栈不必设头结点,因为栈顶(表头)操作链栈不必设头结点,因为栈顶(表头)操作链栈不必设头结点,因为栈顶(表头)操作频繁;频繁;频繁;频繁;采用链栈存储方式,可使多个栈共享空间;采用链栈存储方式,可使多个栈共享空间;采用链栈存储方式,可使多个栈共享空间;采用链栈存储方式,可使多个栈共享空间;当栈中元素个数变化较大,且存在多个栈的当栈中元素个数变化较大,且存在多个栈的当栈中元
13、素个数变化较大,且存在多个栈的当栈中元素个数变化较大,且存在多个栈的情况下,链栈是栈的首选存储方式。情况下,链栈是栈的首选存储方式。情况下,链栈是栈的首选存储方式。情况下,链栈是栈的首选存储方式。说说 明明问:为什么要设计堆栈?它有什么独特用途?问:为什么要设计堆栈?它有什么独特用途?1.调用函数或子程序非它莫属;调用函数或子程序非它莫属;2.递归运算的有力工具;递归运算的有力工具;3.用于保护现场和恢复现场;用于保护现场和恢复现场;4.简化了程序设计的问题简化了程序设计的问题。答:答:数制转换(十转数制转换(十转N)P48 设计思路:用栈暂存低位值设计思路:用栈暂存低位值例例2:括号匹配的检
14、验括号匹配的检验P49 设计思路:用栈暂存左括号设计思路:用栈暂存左括号例例3:表达式求值表达式求值 P52 设计思路:用栈暂存运算符设计思路:用栈暂存运算符例例4:汉诺仪(:汉诺仪(Hanoi)塔)塔P55 设计思路:用栈实现递归调用设计思路:用栈实现递归调用例例1:例例3 表达式求值表达式求值 (这是栈应用的典型例子这是栈应用的典型例子)这里,这里,表达式求值的算法是表达式求值的算法是 “算符优先法算符优先法”。例如:例如:3*(7 2)(1)要正确求值,首先了解算术四则运算的规则:)要正确求值,首先了解算术四则运算的规则:a.从左算到右从左算到右 b.先乘除,后加减先乘除,后加减 c.先
15、括号内,后括号外先括号内,后括号外 由此,此表达式的计算顺序为:由此,此表达式的计算顺序为:3*(7 2)=3*5=15(2)根据上述三条运算规则,在运算的每一步中,对)根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符任意相继出现的算符 1和和 2,都要比较优先权关系。,都要比较优先权关系。算符优先法所依据的算符间的优先关系算符优先法所依据的算符间的优先关系见教材见教材P53表表3.1 (是提供给计算机用的表!)(是提供给计算机用的表!)由表可看出,右括号由表可看出,右括号)和井号和井号#作为作为 2时时级别最低;级别最低;由由c 规则规则得出:得出:*,/,+,-为为 1时的优先
16、权低于时的优先权低于(,高于,高于)由由a规则规则得出:得出:(=)表明括号内运算,已算表明括号内运算,已算完。完。#=#表明表达式求值完毕。表明表达式求值完毕。栈的应用(表达式求值)栈的应用(表达式求值)(3)算法思想:)算法思想:设定两栈:设定两栈:操作符栈操作符栈 OPTR,操作数栈,操作数栈 OPND栈初始化栈初始化:设操作数栈:设操作数栈 OPND 为空;操作符栈为空;操作符栈 OPTR 的栈的栈底元素为表达式起始符底元素为表达式起始符#;依次读入字符依次读入字符:是操作数则入:是操作数则入OPND栈,是操作符则要判断:栈,是操作符则要判断:if 栈顶元素栈顶元素 操作符操作符,则退
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 课件
限制150内