数据结构的C++实现之队列的顺序存储结构(循环队列)

队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO)。 允许插入的一端称为队尾,允许删除的一端称为队头。我们在《栈的顺序存储结构》中发现,栈操作的top指针在Push时增 大而在Pop时减小,栈空间是可以重复利用的,而队列的front、rear指针都在一直增大,虽然前面的元素已经出队了,但它 所占的存储空间却不能重复利用。但大多数程序并不是这样使用队列的,一般情况下出队的元素就不再有保存价值了,这些 元素的存储空间应该回收利用,由此想到把队列改造成环形队列(Circular Queue):把queue数组想像成一个圈,front和 rear指针仍然是一直增大的,当指到数组末尾时就自动回到数组开头,就像两个人围着操场赛跑,沿着它们跑的方向看,从 front到rear之间是队列的有效元素,从rear到front之间是空的存储位置,如果front追上rear就表示队列空了,如果rear 追上front就表示队列的存储空间满了。故一般我们将其实现为循环队列,当出队列时就不需要全部进行移动,只需要修改 队头指针,也可以解决“假溢出”的问题。

示例程序:(改编自《大话数据结构》)

#include<iostream>
using namespace std;

#define MAXSIZE 20

typedef int ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    int front; /* 头指针 */
    int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
} SqQueue;

bool InitQueue(SqQueue *pq)
{
    cout << "Init Queue ..." << endl;
    pq->front = 0;
    pq->rear = 0;
    return true;
}

bool ClearQueue(SqQueue *pq)
{
    cout << "Clear Queue ..." << endl;
    pq->front = 0;
    pq->rear = 0;
    return true;
}

bool QueueEmpty(SqQueue Sq)
{
    return (Sq.front == Sq.rear); /* 队列空的标志 */
}

int QueueLength(SqQueue Sq)
{
    /* 队列的当前长度 */
    return (Sq.rear - Sq.front + MAXSIZE) % MAXSIZE;
}
/* 返回头元素 */
bool GetHead(SqQueue Sq, ElemType *pe)
{
    if (QueueEmpty(Sq))
        return false;
    else
    {
        *pe = Sq.data[Sq.front];
        cout << "Get Head Item " << *pe << endl;
        return true;
    }
}

bool EnQueue(SqQueue *pq, ElemType Elem)
{
 /* 队列满 */
    if (QueueLength(*pq) == MAXSIZE)
        return false;
    cout << "EnQueue Item " << Elem << endl;
    pq->data[pq->rear] = Elem;/* 将元素赋值给队尾 */
    pq->rear = (pq->rear + 1) % MAXSIZE;/* rear指针向后移一位置, */
    /* 若到最后则转到数组头部 */

    return true;
}

bool DeQueue(SqQueue *pq, ElemType *pe)
{
    if (QueueEmpty(*pq))
        return false;
    *pe = pq->data[pq->front];/* 将队头元素赋值给*pe */
    cout << "DeQueue Item " << *pe << endl;
    pq->front = (pq->front + 1) % MAXSIZE;/* front指针向后移一位置, */
    /* 若到最后则转到数组头部 */
    return true;
}

bool QueueTraverse(SqQueue Sq)
{
    cout << "Queue Traverse ..." << endl;
    for (int i = 0; Sq.front + i < Sq.rear; i = (i + 1) % MAXSIZE)
        cout << Sq.data[i + Sq.front] << ' ';
    cout << endl;
    return true;
}

int main(void)
{
    SqQueue Sq;
    InitQueue(&Sq);
    for (int i = 0; i < 5; i++)
        EnQueue(&Sq, i);
    QueueTraverse(Sq);
    int result;
    GetHead(Sq, &result);
    DeQueue(&Sq, &result);
    DeQueue(&Sq, &result);
    if (!QueueEmpty(Sq))
        cout << "Queue Length: " << QueueLength(Sq) << endl;
    QueueTraverse(Sq);

    return 0;
}

输出为:

单是顺序存储,若不是循环队列,算法的时 间性能是不高的,但循环队列也面临着数组可能溢出的问题。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 数组
, 循环队列
, 存储
, 队列
, return
, maxsize
, 元素
, 循环队列存储
, c++顺序栈
, 顺序队列
, 环形队列类
, 环形队列
环形无锁队列
顺序循环队列的实现、循环队列的实现、设顺序循环队列、设顺序循环队列q、顺序循环队列,以便于您获取更多的相关知识。

时间: 2024-09-20 01:11:41

数据结构的C++实现之队列的顺序存储结构(循环队列)的相关文章

JavaScript队列、优先队列与循环队列_javascript技巧

队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先出的数据结构 队列的前面是队头 队列的后面是队尾 出队从队头出 入队从队尾入 队列的创建 和栈类似,这里我就不就不啰嗦了 同样需要实现一些功能 这里我类比生活中的排队上厕所 向队列中添加元素(进入排队的队伍中) 移除队头元素(队伍最前面的人出队进入厕所) 查看队头元素(查看队伍最前面的人) 判断队列

大话数据结构八:队列的顺序存储结构(循环队列)

1. 什么是队列? 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 2. 队列的特点: 队列是一种先进先出(First In First out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头. 3. 队列顺序存储有什么不足? 使用数组实现的顺序存储,当做出队列操作时,所有的元素都需要向前移动一位,性能很低. 4. 什么是循环队列? 队列头尾相接的顺序存储结构称为循环队列. 如图所示:front记住队头元素下标,rear记住队尾元素的下一个元素. 注意:

数据结构的C++实现之栈的顺序存储结构

栈(stack)是限定在表尾进行插入和删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构.   示例程序:(改编自<大话数据结构>) #include <iostream> using namespace std; #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[

javascript的队列,优先队列,循环队列

按书上的来弄的.慢慢理解了. function Queue() { var items = []; this.enqueue = function(element){ items.push(element); } this.dequeue = function(){ return items.shift(); } this.front = function(){ return items[0]; } this.isEmpty = function(){ return items.length =

C语言循环队列的表示与实现实例详解_C 语言

1.概述: C语言的队列(queue),是先进先出(FIFO, First-In-First-Out)的线性表数据结构.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作. 循环队列可以更简单的防止伪溢出的发生,但是队列大小是固定的. 2.实例代码: /* 队列的顺序存储结构(循环队列) */ #define MAX_QSIZE 5 /* 最大队列长度+1 */ typedef struct { QElemType *base

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

一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-1后的示意图: 上图中,a0是当前 队头数据元素,an-1是当前 队尾数据元素. 为了

详解数据结构C语言实现之循环队列_C 语言

本文讲的是循环队列,首先我们必须明白下面几个问题 循环队列的基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize

循环队列(顺序队列)

一 队列的定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表    (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中没有元素时称为空队列. (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表. 二 顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. 基本操作: 入队时:将新元素插入rear所指的位置,然后将rear加1. 出队时:删去fron

如何实现循环队列_C 语言

生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构.队列分为链式队列和静态队列:静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费:链式队列是用链表来实现队列的. #ifndef SQQUEUE_H_INCLUDED #define SQQUEUE_H_INCLUDED /* 防止重复包含 */ /////////////////