文章目录

  • 1 循环队列定义
  • 2 循环队列基本操作
  • 3 循环队列代码实现
  • 4 补充

1 循环队列定义

循环队列:即顺序存储的队列,是为了避免“假溢出”而利用%运算符将队列首尾相接连成一个环状的队列,称为循环队列。

引入循环队列克服顺序队列中存在的“假上溢”现象。

假上溢:

因为在入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为“假上溢”。
简而言之就是数组中有空位置却不能再做入队,出队操作

2 循环队列基本操作

  1. 队空与队满
    为什么要分析队空队满的条件?

循环队列是顺序存储的队列,而顺序队列在做入队时要先判断队列是否已满,即是否已经用完预分配的空间,出队时要判断队列是否已空。


约定:

front指向队列中实际头元素的位置
rear 指向队列中实际尾元素的后一位置

  1. 入队

rear=(rear+1)%MAXSIZE
queue[rear]=x
  1. 出队

front=(front+1)%MAXSIZE
x=queue[front]
  1. 队空:front==rear

  1. 队满:front==(rear+1)% MAXSIZE

3 循环队列代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSZIE (20)typedef int ElementType;
typedef struct SqQueue {ElementType data[MAXSZIE];int front;int rear;
} *Queue;Queue InitQueue(void)
{Queue Q = (Queue)malloc(sizeof(struct SqQueue));Q->front = 0;Q->rear = 0;return Q;
}int IsEmpty(Queue Q)
{return Q->front == Q->rear;
}int IsFull(Queue Q)
{return (Q->rear + 1) % MAXSZIE == Q->front;
}void EnQueue(Queue Q, ElementType e)
{if (IsFull(Q)) {return;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSZIE;
}void DeQueue(Queue Q, ElementType *e)
{if (IsEmpty(Q)) {return;}*e = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSZIE;
}int main(void)
{ElementType e;Queue Q = InitQueue();srand((unsigned)time(NULL));for (int i = 0; i < 10; i++) {e = rand() % 100;EnQueue(Q, e);}while (!IsEmpty(Q)) {DeQueue(Q, &e);printf("%d ", e);}
}

4 补充

  1. 为什么要设计堆栈?它有什么独特用途?

① 调用函数或子程序非它莫属;
② 递归运算的有力工具;
③ 用于保护现场和恢复现场;
④ 简化了程序设计的问题。

  1. 为什么要设计队列?它有什么独特用途?

① 离散事件的模拟(模拟事件发生的先后顺序,例如 CPU芯片中的指令译码队列);
② 操作系统中的作业调度(一个CPU执行多个作业);
③ 简化程序设计。

  1. 什么叫“假溢出” ?如何解决?

答:在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。
解决假溢出的途径———采用循环队列。

  1. 线性表、栈、队的异同点:

相同点

逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。

不同点

① 运算规则不同:线性表为随机存取;
而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;
队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。
② 用途不同:线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、OS作业调度和简化设计等。

循环队列的介绍与实现相关推荐

  1. 队列之循环队列详解(C语言版)

    文章目录 前言 一.循环队列的定义 二.循环队列的结构 三.循环队列的常用操作 结语 附录 前言 大家好,越努力,越幸运.本篇文章小猿将跟您分享数据结构队列中的循环队列,希望对您有所帮助. 一.循环队 ...

  2. 大话数据结构 队列10:数组循环队列

    基础介绍 队列 先进先出,出列在队头,进列在队尾 数组可以做成循环队列. 循环队列的一个重要问题:判断队列是空是满? 空队列的判断比较简单:尾游标等于头游标 满队列的判断比较复杂:如果也是用尾游标等于 ...

  3. 字符串队列c语言,C语言实现循环队列(队列可存储字符串)

    项目原因,需要写一个队列来存储串口实时输出的字符串.看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串.这里分享一种可以实现的方法. 关于 ...

  4. C/C++队列与循环队列

    C/C++数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构,每次对队列的增删操作如下 增:在队列尾部添加元素 删(取出):在队列头部删除元素 这种数据存储方式遵循 ...

  5. 循环队列CircleQueue的使用

    循环队列CircleQueue 的使用 循环队列是实际编写应用中比较重要的一种数据结构,下面介绍在实际项目中用到的循环队列CircleQueue.它是用C++编写的,具体源代码见 https://gi ...

  6. 顺序循环队列的基本操作

    [问题描述] 实现循环队列的基本操作.(循环队列最大长度不超过20) [输入形式] 输入若干个整数(以空格分隔,非整数结束输入),其中0表示做出队操作,不为0的整数为入队元素. [输出形式] 若出队错 ...

  7. python环形队列_Python 实现数据结构-循环队列的操作方法

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  8. java循环队列_Java版-数据结构-队列(循环队列)

    前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...

  9. python循环队列_JS 队列-优先队列、循环队列

    <学习JavaScript数据结构与算法>读书笔记. 队列是遵行FIFO(First In First Out, 先进先出)原则的一组有序的项.队列再尾部添加新元素,并从顶部移除元素. 在 ...

最新文章

  1. Datawhale组队学习周报(第021周)
  2. Google发布新的TensorFlow物体检测API
  3. redis持久化策略梳理及主从环境下的策略调整记录
  4. 解决ubuntu16.04 qt5.9.1无法输入中文
  5. SVN 服务器端的搭建-及多仓库管理-OK
  6. Groovy 学习手册(4)
  7. Django中应用celery
  8. 实践:加快gradle的构建速度
  9. vagrant共享目录出现“mount:unknown filesystem type ‘vboxsf‘”错误解决方法(亲测可行)
  10. 变分法证明两点之间线段最短
  11. numpy array 升维
  12. Kubernetes(k8s)从入门到精通
  13. 51nod3431 取石子游戏
  14. 数据推荐 | 自然对话语音数据集
  15. python 编程入门学习基础
  16. multi-angle cosine and sines
  17. WinRAR(去广告)中文繁体
  18. npcap loopback adapter是什么意思_阜阳为什么叫阜阳,阜阳古时候叫什么,阜阳历史的由来...
  19. 判断任意一个二维数组里是否有鞍点(多个鞍点和单个鞍点均能判断),以及鞍点的输出(c语言)
  20. WINDOWS的常用软件点评(1)------系统必备软件篇

热门文章

  1. 那些有趣的电子漫画合集
  2. 数据结构之堆:堆的排序,Python代码实现——13
  3. python脚本加密_教你如何基于python实现脚本加密
  4. JavaScript高级之ECMAScript 6 新特性
  5. 二、nodemon-Node.js 监控工具
  6. LeetCode meituan-003. 小美的跑腿代购(排序)
  7. LeetCode 1673. 找出最具竞争力的子序列(单调栈)
  8. LeetCode 1256. 加密数字(bitset)
  9. LeetCode 1254. 统计封闭岛屿的数目(图的BFS DFS)
  10. LeetCode 888. 公平的糖果交换(哈希set)