- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]队列
第9章 栈和队列 9.2 队列 9.2 队列 队列的基本概念 定义:队列是一种只允许在表的一端进行插入、而在另一端进行删除的线性表。是一种“先进先出”或“后进后出”的线性表。 允许插入的一端称为队尾,允许删除的一端称为队头。 9.2 队列 9.2 队列 队列的基本运算 置空队列 判断队列是否为空 进队列运算 出队列运算 顺序队列 队列的顺序存储结构--顺序队列 顺序队列的类型说明 typedef struct { datatype data[m]; int front,rear; }queue; queue *cq; 顺序队列 思考: m表示什么? front, rear分别表示什么,为什么要设置成int型? 初始状态下,如何表示队列为空? 元素入队时如何表示? 元素出队时如何表示? 队列的长度如何表示? 顺序队列 思考:在进行入队操作时。如果队列已满,若再进行入队则引起上溢,但这时会发现队头前面还有空的单元,这种现像称为“假上溢”如何避免这种情况? 1.在每次出队时将整个队列中的元素向前移动一个位置。 2.发生假上溢时将整个队列中的元素向前移动。 3.构造循环队列 循环队列 定义:将向量空间形成一个首尾相接的环形向量。并称这种向量为循环向量。存储在其中的队列称为循环队列。 循环队列 循环队列 初始状态:cq-front=cq-rear=m-1 插入一个新元素: if(cq-rear+1=m) cq-rear=0;else cq-rear++; 或者cq-rear=(cq-rear+1)%m; 删除一个元素: cq-front=(cq-front+1)%m; 队列空时: cq-front= cq-rear 队列满时: cq-front= cq-rear 思考:如果满足条件front=rear,则该队列是空还是满? ① 另设一标志变量以区别队列的空和满;② 少用一个元素的空间。约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:front所指的单元始终为空,cq-data[cq-front]是空闲的,循环队列中的元素个数不能超过m-1);③使用一个计数器记录队列中元素的总数(即队列长度)。 循环队列的基本运算 判队空int EMPTYCQ(queue *cq){ if (cq-rear==cq-front) rerurn(1); else return(0); } 循环队列的基本运算-入队 输入及辅助变量:循环队列指针为cq,队头、队尾指针为front rear. 输出:入队成功返回逻辑值“1”,否则为“0”。 循环队列的基本运算—入队 Int ADDCQ(queue *cq,datatype x) { if(cq-front==(cq-rear+1)%m) { printf(“queue is full “); return(0); } else { cq-rear=(cq-rear+1)%m; cq-data[cq-rear]=x; return(1); } } 循环队列的基本运算-出队 输入及辅助变量:循环队列指针为cq,队列的头指针为front,暂存变量为y。 输出:队列下溢则返回“空”值。或出队元素变量y. 循环队列的基本运算-出队 datatype *DELCQ(queue *cq) { datatype *y; if(EMPTYCQ(cq)) { print(“queue is empty”); return NULL; } else { y=(datatype*)malloc(sizeof(datatype)); cq-front=(cq-front+1)%m; *y=cq-data[cq-front]; return(y); } } 队列的链式存储结构--链队列 队列的链式存储是用一个线性链表来实现一个队列的方法,线性链表表示的队列称为链队列(表头删除,表尾
文档评论(0)