问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么循环队列队满的是(rear+1)%max_queue_size=front不可以是rear.next=front

发布网友 发布时间:2022-04-18 18:00

我来回答

2个回答

热心网友 时间:2022-04-18 19:29

队列是一种特殊的表,因此凡是可以用来实现表的数据结构都可以用来实现队列。不过,队列的中的元素的个数通常不固定,因此常用循环数组和链表两种方法实现队列。

链队列:

用指针实现队列得到的实际上是一个单链表。由于入队在队尾进行,所以用一个指针来指示队尾可以使入队操作不必从头到尾检查整个表,从而提高运算的效率。另外,指向队头的指针对于Gethead和Dequeue运算也是必要的。为了便于表示空队列,我们仍使用一个表头单元,将队头指针指向表头单元。当队头和队尾指针都指向表头单元时,表示队列为一个空队列。

用指针实现队列时,单元类型及队列类型可说明如下:

type

queueptr=^queuenode;

queuenode=record

data:elemtp;

next:queueptr;

end;

linkedquetp=record

front,rear:queueptr;

end;

其中front为队头指针,rear为队尾指针。图2是用指针表示队列的示意图。

图2

面我们来讨论队列的5种基本运算。

函数 Gethead(Q)

功能

这是一个函数,函数值返回队列Q的队头元素。

实现

Function Gethead(var Q:linkedquetp):elemtp;

begin

if Empty(Q) then error('The queue is empty!')

else return(Q.front^.next^.data);

end;

函数 Enqueue(Q,x)

功能

将元素x插入队列Q的队尾。此运算也常简称为将元素x入队。

实现

Procere Enqueue(x:elemtp;var Q:linkedquetp);

begin

new(Q.rear^.next);

Q.rear:=Q.rear^.next;

Q.rear^.data:=x;

Q.rear^.next:=nil;

end;

函数 Empty(Q)

功能

这是一个函数,若Q是一个空队列,则函数值为true,否则为false。

实现

Function Empty(var Q:QueueType):Boolean;

begin

return(Q.front=Q.rear);

end;

函数 Dequeue(Q)

功能

将Q的队头元素删除,简称为出队。

实现

Procere Dequeue(var Q:linkedquetp);

var

p:queueptr;

begin

if Empty(Q) then Error('The queue is empty!')

else begin

p:=Q.front;

Q.front:=Q.front^.next;

dispose(p);

end;

end;

函数 Clear(Q)

功能

使队列Q成为空队列。

实现

Procere clear(var Q:linkedquetp);

begin

Q.rear:=Q.front;

while Q.front<>nil do

begin

Q.front:=Q.front^.next;

dispose(Q.rear);

Q.rear:=Q.front;

end;

new(Q.front);

Q.front^.next:=nil;

Q.rear:=Q.front;

end;

循环队列:

我们可以将队列当作一般的表用数组实现,但这样做的效果并不好。尽管我们可以用一个游标last来指示队尾,使得Enqueue运算可在O(1)时间内完成,但是在执行Dequeue时,为了删除队头元素,必须将数组中其他所有元素都向前移动一个位置。这样,当队列中有n个元素时,执行Dequeue就需要O(n)时间。为了提高运算的效率,我们用另一种方法来表达数组中各单元的位置关系。设想数组中的单元不是排成一行,而是围成一个圆环 ,我们将队列中从队头到队尾的元素按顺时针方向存放在循环数组中一段连续的单元中。当需要将新元素入队时,可将队尾游标Q.rear按顺时针方向移一位,并在新的队尾游标指示的单元中存入新元素。出队操作也很简单,只要将队头游标Q.front依顺时针方向移一位即可。容易看出,用循环数组来实现队列可以在O(1)时间内完成Enqueue和Dequeue运算。执行一系列的入队与出队运算,将使整个队列在循环数组中按顺时针方向移动。通常,用队尾游标Q.rear指向队尾元素所在的单元,用队头游标Q.front指向队头元素所在单元的前一个单元,并且约定只能存放maxsize-1个元素如图3所示。

图3

此时队列的定义如下:

const m=maxsize-1

type cyclicquetp=record

elem:array[0..m] of elemtp;

rear,front:0..m;

end;

var sq:cyclicquetp;

这时 当 sq.rear=sq.front 时队空 当 (sq.rear+1) mod maxsize=sq.front 时队满

先 sq.rear=( sq.rear+1) mod maxsize 后进队

先 sq.front=(sq.front+1)mod maxsize 后出队

队列中元素的个数(sq.rear-sq.front+maxsize) mod maxsize

热心网友 时间:2022-04-18 20:47

另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0)。

http://ke.baidu.com/view/203647.htm
去链接里仔细看看图
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙到西昌。坐火车先从长沙到成都、成都东,再到西昌,哪个方便一些 S先生与P先生谜题的题面 为什么首都设在襄阳 改姓可以不随父母性吗 韩艺瑟怎么改姓? 纸、墨、笔、砚是中国传统的文房四宝,墨的使用最早在 [ ] A.商代后期... 想问下创维光伏E企赢模式有哪些优势,到底值不值得投资啊?有没有合作... 太平洋太享e保百万医疗值得入手吗?每年花多少钱? 爱e满分适合哪些人买?注意哪些问题? 太平洋太享e保百万医疗适合哪些人买?价格多少? 微信好友被删了,自己又不知道他的了。怎么找回? 为什么要找专业的钢琴陪练老师 无水箱马桶存水位太高怎么处理 节水型水箱是利用什么原理节水的(抽水马桶) 二建证书怎么领取时间 湖北二建什么时候拿证 二建注册完成可以自己拿证吗 小森生活蛤蜊有什么用 如何利用Siri抢鞋 RTXA5000驱动崩溃 求技嘉GeForce RTX? 3060VISION OC 12G显卡驱动V461.72网盘资源 2060super最佳驱动 影驰rtx3050大将没有win7驱动 求华硕 ASUS DUAL-RTX3060-12G显卡驱动 V461.72 官方版网盘资源 RTX3030ti显卡适合什么驱动 跪求英伟达 RTX 3060显卡驱动 V470.05 beta版软件百度云资源 RTX自动更新驱动程序一直显示安装失败 换还能找回之前被删的好友吗? 老树瓜粉能和鸡蛋一起吃吗? 南瓜粥可以和鸡蛋炒韭菜一起吃吗 新生儿晚上睡觉的时候,是开着灯更好还是关着灯更好呢? 新生儿晚上睡觉开不开灯 如何区分橘子橙子和柠檬? 新生儿睡觉要开灯吗,开灯睡觉的危害有哪些? 新生儿指的是多大的宝宝?晚上睡觉是开灯对还是不开灯对? 宝宝晚上睡觉,开灯好,还是不开灯好呢? 有没有让QQ头像赞 变成 很多的软件 新生儿睡着开灯还是关灯好 请问橘子、橙子和柠檬有什么区别? 新生儿夜间睡觉要一直开灯吗 新生儿晚上能开灯睡吗 新生儿适合开灯睡觉吗 刚出生的婴儿晚上睡觉开灯可以吗 宝宝晚上时睡觉可以开灯吗?开灯的话会有哪些好处? 橙子柠檬的区别 柠檬和橙子或者橘子一样吗? 杀毒软件最好用?不要广告 一句歌词 不做你爱的傀儡 有什么流行歌曲好听,本人20,喜欢徐良这种风格的歌曲。谢谢 周杰伦《我不配》的歌词你知道吗?