- 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章 栈和队列 3.2 栈的应用举例 3.3 队列 3.4 队列的应用举例 (3)出队 datatype delqueue(sequeue *sq) { if(sq-front= =sq-rear) return(NULL); else return(sq-queue[++sq-front]); } 以上算法在入队运算中,由于队满条件的限制会产生 “假上溢”现象,即当前队列并没有满但会产生“上溢”。如图3.13所示。 为了更好地解决“假上溢” 问题,可以将顺序队列设想为一个首尾相接的圆环,称为循环向量,队列称为循环队列,如图3.14所示。此时,可以克服“假溢出”现象。 队尾指针加1的运算在循环意义下可描述为: if(sq-rear+1= =MAXSIZE) sq-rear=0; else sq-rear++; 也可以利用利用数学上的求模运算描述为: sq-rear=(sq-rear+1) % MAXSIZE 同样,出队运算时,在循环意义下的队头指针加1运算可描述为: sq-front=(sq-front+1) % MAXSIZE 但在利用循环队列时会出现队空和队满两种不同的状态无法区别的情形,如图3.14(b)和(c),利用等式sq-front=sq-rear都可以表示队空和队满两种不同的状态。 一般的,可利用以下两种方法解决这个问题: (1)设置一个区别队列满与队列空的标志,该标志用于标记在队列中执行的最后一次运算。不过,使用标志会减慢队列入队和出队的速度。 (2)第二种方法是在入队运算之前,先判断(sq-rear+1)%MAXSIZE与sq-front是否相等,若相等,则认为队列满。但这样会使得在循环队列中队头指针所指的位置始终是空的,有MAXSIZE个分量的循环空间只能表示长度不超过MAXSIZE-1的队列。但通过少利用一个元素空间而解决了队满与队空条件相同的矛盾,总的来说是可行的。 循环队列的入队和出队运算算法描述如下: (1)入队列算法 int encyque(sequeue *sq,datatype x) { if((sq-rear+1)%MAXSIZE==sq-front) return(FALSE); else {sqrear=(sq-rear+1)%MAXSIZE; sq-queue[sq-rear]=x; return(TRUE); } }(2)出队列算法 datatype delcyque(sequeue *sq) { if(sq-front= =sq-rear) return(NULL); else {sq-front=(sq-front+1)%MAXSIZE; return(sq-queue[sq-front]); } } 3.3.3 队列的链式存储结构 队列的链式存储结构简称为链队列,它是限制在表头删除即出队和表尾插入即入队的单链表。它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向表头结点,而尾指针则指向队尾元素。一个链队列可由一个队头指针和一个队尾指针唯一地确定,如图3.15。 链队列定义如下: typedef struct node {datatype data; struct node *next; }queuenode; /*定义链队列中的一个结点结构*/ typedef struct {queuenode *front,*rear; }linkqueue; /*定义链队列结构*/ linkqueue *lq; 链队列上的几种基本运算描述: (1)置空队 void inilinkque(linkqueue *lq) { lq-front=(queuenode *)malloc(sizeof(queuenode)); lq-rear=lq-front; lq-front-next=NULL; } (2)入队 void enlinkqu
您可能关注的文档
最近下载
- 2024年4月 全国高等教育自学考试真题 人员素质测评理论与方法 06090.doc VIP
- 路基挡土墙专项施工方案 - 大模板.docx VIP
- 一种可连续工作的氦气纯化器与纯化方法.pdf VIP
- 抢救药品相关试题(附答案).docx VIP
- 施工现场机械设备检查技术规范 JGJ 160-2016知识培训.pptx
- 2017年版2020年修订普通高中语文课程标准解读与培训课件.pptx VIP
- (人教2024版新教材)英语四年级上册Unit4.2 Part A Let’s learn&Match, act and guess课件.pptx
- 2025届高考散文一轮整体复习:写人叙事类散文——《放牛记》全文详解+课件.pptx VIP
- 热力管道工程质量保证措施和体系.pdf VIP
- 黄帝内经的临床医学理论.PPT VIP
文档评论(0)