- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 栈和队列 教学要求 1.掌握:栈和队列的定义及特性。 2.掌握:栈和队列的基本运算以及实现算法。 3.掌握:使用栈和队列解决实际应用问题。 主要内容 3.1 栈 3.2 算术表达式求值 3.3 队列 3.4实训 3.1 栈 3.1.1 栈的定义及其运算 3.2 算术表达式求值 3.3.1 队列的定义及其运算 3.3.2 队列的顺序存储结构 3.3.3 队列的链式存储结构 3.3.4 其它队列 本章小结 习 题 三 (6)求队列长度操作 【算法3.19 顺序队列的求长度操作】 int length(sqqueue *q) {/*返回队列q的元素个数*/ return(q-rear-q-front); 3.循环队列 MAXNUM-1 0 1 rear front 图3-10 循环队列示意 在顺序队列中,当队尾指针已经指向了队列的最后一个位置时,此时若有元素入列,就会发生“溢出”。在图3-9(c)中队列空间已满,若再有元素入列,则为溢出;在图3-9(d)中,虽然队尾指针已经指向最后一个位置,但事实上队列中还有3个空位置。也就是说,队列的存储空间并没有满,但队列却发生了溢出,我们称这种现象为假溢出。解决这个问题有两种可行的方法: (1)采用平移元素的方法,当发生假溢出时,就把整个队列的元素平移到存储区的首部,然后再插入新元素。这种方法需移动大量的元素,因而效率是很低的。 (2)将顺序队列的存储区假想为一个环状的空间,如图3-10所示。我们可假想q-queue[0]接在q-queue[MAXNUM-1]的后面。当发生假溢出时,将新元素插入到第一个位置上,这样做,虽然物理上队尾在队首之前,但逻辑上队首仍然在前。入列和出列仍按“先进先出”的原则进行,这就是循环队列。 很显然,方法二中不需要移动元素,操作效率高,空间的利用率也很高。 在循环队列中,每插入一个新元素时,就把队尾指针沿顺时针方向移动一个位置。即: q-rear=q-rear+1; if(q-rear= =MAXNUM) q-rear=0; 在循环队列中,每删除一个元素时,就把队头指针沿顺时针方向移动一个位置。即: q-front=q-front+1; if(q-front= =MAXNUM) q-front=0; 0 1 2 3 4 5 front rear (b) A B C 0 1 2 3 4 5 front rear (a) 0 1 2 3 4 5 A B C D E F front rear (c) 图3-11 循环队列示意图 (a)队列空;(b)队列非空;(c)队列满 图3-11所示,为循环队列的三种状态,图3-11(a)为队列空时,有q-front= =q-rear;图3-11(b)为队列满时,也有q-front= =q-rear;因此仅凭q-front= =q-rear不能判定队列是空还是满。 为了区分循环队列是空还是满,我们可以设定一个标志位s: s= 0时为空队列,s=1时队列非空。 用C语言定义循环队列结构如下: typedef struct {Elemtype queue[MAXNUM]; int front; /*队头指示器*/ int rear; /*队尾指示器*/ int s; /*队列标志位*/ }qqueue; 下面给出循环队列的初始化、入队列及出队列的算法。 (1)初始化队列 【算法3.20 循环队列的初始化】 int initQueue(qqueue *q) {/*创建一个空队列由指针q指出*/ if ((q=(qqueue*)malloc(sizeof(qqueue)))= =NULL) return FALSE; q-front= MAXNUM; q-rear=MAXNUM; q-s=0; return TRUE; } (2)入队列操作 【算法3.21 循环队列的入队列操作】 int append(qqueue *q,Elemtype x) {/*将元素x插入到队列q中,作为q的新队尾*/ if (( q-s= =1)(q-front= =q-rear)) return FALSE; /*队列满*/ q-rear++; if (q-rear= =MAXNUM) q-rear=0; q-queue[q-rear]=x; q-s=1; /*置队列非空*/ return TRUE; } (3)出队列操作 【算法3.22 循环队列的出队列操作】 Elemtype delete(qqueue *q) {/*若队列q不为空,则返回队头元素*/ E
您可能关注的文档
- 数据结构(C语言版) 全套课件.pptx
- 数据结构(C语言版)第八章 查找.ppt
- 数据结构(C语言版)第二章 线性表.ppt
- 数据结构(C语言版)第九章 排序.ppt
- 数据结构(C语言版)第六章 树.ppt
- 数据结构(C语言版)第七章 图.ppt
- 数据结构(C语言版)第四章 串.ppt
- 数据结构(C语言版)第五章 数组和广义表.ppt
- 数据结构(C语言版)第一章 绪论.ppt
- 数据库系统原理与应用(第三版)(SQL Server ) 全套课件.pptx
- 2025年市总工会党组书记、市委组织部部长生活会“四个带头”个人对照检查发言材料2篇(含上年度整改+个人情况、个人事项+典型案例).docx
- 2025年部编版小学六年级下册《道德与法治》第四单元 让世界更美好第10课 我们爱和平教学课件.pptx
- 公司领导班子2025年围绕“四个带头”主题检视问题整改落实方案与组织生活会批评意见(20条)2篇文.docx
- 教育系统党组班子2025年对照“四个带头”含意识形态、以典型案例举一反三解析检视材料【2篇文】.docx
- 2025年国有企业领导班子、学校副校长生活会“四个带头”方面对照个人检视发言材料2篇文(附:上年度整改情况、典型案例解析).docx
- 2025年生活会“四个带头”个人对照检查材料2篇文(含对其他领导批评意见,个人公开事项申报、意识形态).docx
- 2025年国有企业党委书记、领导班子生活会“四个带头”方面对照检查发言材料2篇文(上年度整改情况).docx
- 乡镇领导班子、市委组织部常务副部长2025年对照“四个带头”含违纪行为为典型案例的剖析与反思检视剖析材料{2篇文}.docx
- 市委社会工作部2025年生活会领导班子对照检视发言材料2篇文(含以案为鉴,深刻反思存在问题、反面典型案例举一反三解析、其他需要说明情况).docx
- 2025年民主生活会、组织生活会批评意见(20条)与市直单位领导班子“四个带头”对照检查材料【含上年度查摆问题整改落实情况】2篇文.docx
文档评论(0)