作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/28 21:55:55
为什么循环队列队满的是(rear+1)%max_queue_size=front不可以是rear.next=front
另一种方式就是数据结构常用的:队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算.如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0).
去链接里仔细看看图
再问: 那为什么不可以是rear.next=front,还有rear(5)+1为什么等于6!为什么等于front(0),循环只是逻辑上的循环是什么意思
再答: ....看图没呀... 循环队列说白了就是个数组,只不过当到达队尾时,让它回到队头. 还有这是定义  typedef struct{   int front; //头指针,队非空时指向队头元素   int rear; //尾指针,队非空时指向队尾元素的下一位置   int count;//计数器,记录队中元素总数   DataType data[QueueSize];   }CirQueue; 根本没有rear.next这个好不.... 如图数组是 0 1 2 3 4 5 rear此时为5,那rear+1不就是6了....然后长度为6,所以求余为0呀,就是队头
再问: rear此时为5为什么是5, int rear; //尾指针,队非空时指向队尾元素的下一位置,那怎么不是6, 还有数组是1 2 3 4 5 6,rear此时为多少呢
再答: 数组的下标从0开始,如果一个数组0 1 2 3 4 5,数组长度n=6 这时rear不能是6,因为就没有开辟空间到六,所以当rear要指向6时,就让他返回到0,这次才是循环麻。 所以每次入队时,都要判断下rear+1是否为n,如果相等就入队,然后令rear=0.不相等就令rear+1 但这个缺点就是即使rear==front,也不能说明队是空还是满 所以用了2种办法来解决,其中一个办法就是设一个空位,就比入说这个数组A 0 1 2 3 4 5 A[5]就不能存储数据,所以rear可以等于5,因为下标是从0开始的,所以当(rear+1)%n==front时,队为满。若rear=front时为空
再问: int rear; //尾指针,队非空时指向队尾元素的下一位置 问下那为什么元素x入队列,rear指向x,而不是x得下一个位置
再答: 就是指向x的下一个呀,比如说数组有5个就是 0 1 2 3 4 a b c f r 0,1,2有a,b,c。front指向0,rear指向3 0 1 2 3 4 a b c x f r x入队就变成这样了,这就是队满了,因为设定的就是最后一位不能放
再问: 你有QQ吗?可以给我吗?我发图片给你看,这个发不了图片
再答: 453508335