- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.5.2 节已经完成了创建空顺序队列的操作,接下来将通过代码展示如何向顺序队列中添加数据 结点。在添加数据结点之前,需要判断顺序队列是否为满,如果为满则不允许添加结点,否则会造成数据在内存上越界。 顺序队列的数据结点处理比较特殊,如图 3.6 所示。 图 3.6 中,初始时顺序队列为空,front 与 rear 初始值为 0;当顺序队列为满时,front 值不变,rear 值为 6;删除 2 个结点后,front 值为 2,rear 值不变。 由图 3.6 可知,删除前两个结点后,顺序队列未满,可以选择继续添加数据结点。添加数据结点 意味着 rear 值继续增大,但此时 rear 值已经为最大值,无法继续增大,这导致存储前两个结点的空 间无法继续使用,这种情况称为“溢出”。 针对上述情况,为了满足队列未满即可插入以及队列未空即可删除的需求,需要将顺序队列抽 象为一个循环的表,这种意义下的顺序队列称为循环队列,如图 3.7 所示。 为了实现循环并且能够判断队列的状态是空或满,队列中必须预留一个结点的空间,即这一个 结点的空间不用来存储数据。图 3.7 所示的循环队列只是一种逻辑上的抽象,为了达到这一效果,只 需要让 front 值与 rear 值执行循环。简单地说,即 front 值与 rear 值增加到最大后,可以从 0 开始继 续增加。 将上述思想应用到实际的队列,如图 3.8 所示。 在执行出队之前,需要判断顺序队列是否为空,如果为空,没有数据可以移出。代码如下所示 (变量定义与例 3-5 一致)。 /*判断顺序队列是否为空*/int sequeue_empty(sequeue_t *sq){ /*当 front 值等于 rear 值时,为空队*/ return sq-front == sq-rear ? 1 : 0; } 由图 3.8(a)可知,当 front 值与 rear 值相等时,顺序队列为 空。除此之外,顺序队列在经历多次入队、出队(front 值、rear 值 多次增加、取余)后,也可能会出现这两个值相等的情况,如图 3.9 所示。 将 3.5.3 节和 3.5.4 节的功能代码与例 3-5 结合,测试数据操作是否成功,如书中例 3-6 所示。 例 3-6 中,主函数主要用于测试子函数是否正确。首先执行入队操作,然后执行出队操作;并通 过显示出队数据,判断顺序队列是否遵循先进先出的规则。输出结果如下所示。 链式队列作为单链表的一种,其插入操作在队尾进行,删除操作在队头进行,通过指向队列头 部的指针与指向队列尾部的指针控制队列的操作,如图 3.10 所示。 由图 3.10 可知,front 指针与 rear 指针用来完成链式队列的数据操作,代码如下所示。 typedef int datatype_t; typedef struct node{ datatype_t data; /*结点数据*/ struct node *next; /*指向下一个结点*/ }linknode_t; typedef struct{ /*指向队头结点与队尾结点的指针*/ linknode_t *front; linknode_t *rear; }linkqueue_t; 以上代码中,第一个封装结构体表示链式队列中的数据结点,第二个封装结构体存放指向链式 队列头尾结点的指针。 在对链式队列中的数据进行操作之前,需要先创建一个空的链式队列。通过代码实现创建一个 空的链式队列 接下来将通过代码展示如何向链式队列中加入数据 结点。链式队列不同于顺序队列,不需要设定队列的大小,因此也不需要判断队列是否为满。 在出队之前,需要判断链式队列是否为空,如果为空,没有数据可以移出。 将 3.6.3 节和 3.6.4 节的功能代码与例 3-7 结合,测试数据操作是否成功 3.6.3 入队 3.6.4 出队 3.6.5 整体测试 初心至善 匠心育人 3.6 队列的链式存储 3.6.1 ?链式队列的定义 初心至善 匠心育人 3.6 队列的链式存储 3.6.2 ?链式队列的创建 初心至善 匠心育人 3.6 队列的链式存储 3.6.3 ?入队 初心至善 匠心育人 3.6 队列的链式存储 3.6.4 ?出队 初心至善 匠心育人 3.6 队列的链式存储 3.6.5 ?整体测试 THANK YOU FOR YOUR WATCHING 第 3 章 栈与队列 栈的概念 栈的顺序存储 栈的链式存储 队列的概念 队列的顺序存储 队列的链式存储 例如,栈(a1,a2,a3,... ,ai),其中 a1 为栈底 结点,而 ai 为栈顶结点。如果需要插入或删 除结点,只能从栈顶操作
文档评论(0)