网站大量收购独家精品文档,联系QQ:2885784924

数据结构(C语言版)第三章 栈和队列.ppt

数据结构(C语言版)第三章 栈和队列.ppt

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

您可能关注的文档

文档评论(0)

别样风华 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档