循环队列假溢出

循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。

解决这个问题的方法至少有三种:

① 另设一布尔变量以区别队列的空和满;

② 少用一个元素的空间。约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);

③使用一个计数器记录队列中元素的总数(即队列长度)。

时间: 2024-08-06 16:15:38

循环队列假溢出的相关文章

数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

循环队列

利用线性表实现队列,为了有效利用空间,将其设计为循环结构,防止假溢出:牺牲一个存储单元以区分队空.队满. 设front队头,rear队尾,N为顺序表大小 队空:rear==front 队满:(rear+1)%N==front #include<stdio.h> #define Elemtype int #define N 100 struct Queue { Elemtype data[N]; int front,rear; }; void initQueue(Queue &Q) {

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).

数据结构基础(7) --循环队列的设计与实现

队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为"先进先出(FIFO)",故又称为先进先出的线性表,简单队列如图所示: 循环队列 顺序队列有一个先天不足, 那就是空间利用率不高, 会产生"假溢出"现象,即:其实队列中还有空闲的空间以存储元素, 但我们在判断队列是否还有空间时, 队列告诉我们队列已经满了, 因此这种溢出并不是真正的溢出, 在data数组中依然存在可以放置元素的空位置, 所以说这是一种"

数据结构(C实现)------- 顺序队列(循环队列之计数器实现)

为了能充分的利用空间,解决顺序队列的"假溢出"问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾:另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列. 这节就来实现循环顺序队列. 循环队列中的空闲的空间可以被利用,除非数组空间真的被队列元素全部占用,否则不会上溢.因此,队一此简单的应用外,真正实用的顺序队列是循环队列. 入队时,

数据结构(C实现)------- 顺序队列(非循环队列)

和栈相反,队列是一种先进先出的的线性表.它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的队列是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾,允许删除的一端则稀烂为队头. 顺序队列,即队列的顺序存储结构.由于队列的队头和队尾的位置均发生变化,因此在队列顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需要附设两个指针front和rear指向队头和队尾元素. 为了操作方便,在此约定:在非空队列中,队头指针front始终指向队头元

循环队列的实现(出队,入队,遍历等)

队列的抽象数据类型定义为: 类型名称:队列. 数据对象集:一个有0个或多个元素的有穷线性表. 操作集:对于一个长度为正整数MaxSize的队列Q∈Queue, 记队列中的任一元素item∈ElementType,有: (1)Queue CreateQueue(int MaxSize):创建一个长度为MaxSize的空队列: (2)bool isEmpty(Queue Q):判断队列是否为空,若不空返回true(1),否则返回false(0): (3)void AddQ(Queue Q, Elem

Java 循环队列的实现

队列概念 队列(Queue)是限定只能在一端插入.另一端删除的线性表.允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空队列”. 队列具有先进先出(FIFO)的特性. 普通顺序队列存在的问题 在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后,可能会出现这样的情况: 尾指针rear已指到数组的最后有一个元素,即rear==Ma

循环队列(Circular Queue)

循环队列(Circular Queue) 1. 循环队列的概念 1.1 循环队列的定义 为了能够充分地使用数组中的存储空间,克服"假溢出"现象,可以把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列(circular queue). 1.2 循环队列中各元素的逻辑及存储关系 循环队列的首尾相接,当队头指针front和队尾指针rear进到maxSize-1后,再前进一个位置就自动到0.这可以利用除法取余的运算(%)来实现. (1)队头指针进