循环顺序队列介绍及其C++实现

C++ 顺序队列与循环队列 很好理解,队列就是把数据排成队,先到的排在前面,后到的排在后面,走的时候,在前面的先出去。(不许插队!) 先是顺序队列,也就是基本的排成一队。 实现如下:#include <iostream> #include <cassert> using namespace std; class Queue { private: //记录了队列的数据,数据的队首(标记), 阅读详情

介绍

  1. 队列的操作特性:先进先出
  2. 队列中元素具有相同类型
  3. 相邻元素具有前驱和后继关系
  4. 设置队头、队尾两个指针,以改进出队的时间性能
    约定:队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素

为了解决假溢出,我们将存储队列的数组头尾相接,从而产生了循环队列。

  1. 如何判断循环队列队空?
    队空:front=rear
  2. 如何盘对循环队列堆满?
    队满:front=rear

那么问题就来了,队空和队满的判断条件相同,为了避免队满时产生队空的判断或者相反,我们需要修改队满条件使得队空和堆满的判定条件分开。
方法:浪费一个元素空间,队满时数组只有一个空闲单元。队满条件:(rear+1)%QueueSize==front

——————————————————————————————————————————————————————————

实现代码

文件CirQueue.h

#ifndef CirQueue_byNim
#define CirQueue_byNim

#include<iostream>
using namespace std;

const int QueueSize=100;    //循环队列的最大存储空间 
template <class T>
class CirQueue
{
    private:
        T *data;    //存储数据的数组 
        int front,rear; //队头队尾指针 
    public:
        CirQueue();
        ~CirQueue();
        void EnQueue(T e);
        T DeQueue();
        T GetQueue();
        bool empty();
};

template<class T>
CirQueue<T>::CirQueue()
{
    data=new T[QueueSize];
    front=rear=0;
}

template<class T>
CirQueue<T>::~CirQueue()
{
    delete []data;
    front=rear=0;
}

template<class T>
void CirQueue<T>::EnQueue(T e)
{
    if((rear+1)%QueueSize==front)   //队满条件 
        throw "上溢";
    rear=(rear+1)%QueueSize;
    data[rear]=e;
}

template<class T>
T CirQueue<T>::DeQueue()
{
    if(rear==front) //队空条件 
        throw "下溢";
    front=(front+1)%QueueSize;
    return data[front];
}

template<class T>
T CirQueue<T>::GetQueue()
{
    if(rear==front) //队空条件 
        throw "下溢";
    return data[(front+1)%QueueSize];
}

template<class T>
bool CirQueue<T>::empty()
{
    if(front==rear) //队空条件:front==rear 
        return true;
    return false;
}

#endif
实验3.2 顺序队列&链队列 一、实验目的 1、熟练掌栈的结构特点,掌握队列的顺序存储和链式存储结构和实现。 2、 学会使用队列解决实际问题。 二、实验内容 自己确定结点的具体数据类型和问题规模: 分别建立一个顺序队列和链队列,实现队列的入队和出队操作。 三 、实验步骤 1、依据实验内容分别说明实验程序中用到的数据类型的定义; 2、相关操作的算法表达; 阅读详情

相关推荐

栈和队列(c++)

栈和队列1. 栈1.1 顺序栈1.2 链栈2. 队列2.1 顺序队列2.2 链式队列 1. 栈 栈的原则是先进后出,操作类似于链表。写程序本身就是规则制定的过程,我们是规则的制定者,而栈、队列这些东西都是规则下的产物。 1.1 顺序栈 #include <iostream> using namespace std; typedef int DataType; const int MaxSize = 50;//定义顺序栈的存储容量 class SeqStack{ int top; Data

蹦跶跶 676

数据结构(c/c++)—循环队列的判断空满方式

文章目录前言队列的数据结构初始化一、舍弃空间二、不舍弃空间1.计数器2.设置标志位 前言 我们这里一共三个方法,通过是否舍弃空间来实现队列空满的判断。 队列的数据结构 const int MaxSize=10; typedef struct { int data[MaxSize]; int front,rear; }Queue; front指向第一个元素。 rear指向下一个为空的,可插入的位置。 初始化 bool initqueue(Queue &q){ q.fr

qq_45853229的博客 5269

顺序循环队列和链式队列的类定义和实现(C++).docx

顺序循环队列和链式队列的类定义和实现(C++).docx顺序循环队列和链式队列的类定义和实现(C++).docx

数据结构与算法----队列

1栈的概念 栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last ln First Out)或先进后出FILO(First In Last Out)线性表。 栈顶(Top)∶允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。 栈底(Bottom):是固定端,又称为表头。空栈:当表中没有元素时称为空栈。 #include<stdio.h> #include<malloc.h> #define STACK_.

weixin_45932712的博客 376

顺序循环队列及其操作

任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。

解析c++中的队列排序问题

写一个c++的关于队列排序的算法,队列的特性是先入先出,可以对队列中的数据进行升序、降序的排列组合

c/c++ 数据结构 循环队列

本代码实现了一个基于数组的循环队列(Circular Queue)的基本操作,包括初始化、销毁、判断队列是否为空、判断队列是否已满、入队(Push)、出队(Pull)以及显示队列内容。循环队列是一种特殊的线性数据结构,其操作表现基于FIFO(先进先出)原则,并且其首尾相连,形成一个逻辑上的环状。然后,通过循环将元素0到8入队,并显示每次入队后的队列内容。接着,将队列中的前5个元素出队,并显示每次出队后的队列内容。,然后进行了一系列的操作来测试循环队列的功能,包括入队、出队和显示队列内容。

2301_78564545的博客 1212

顺序队列的实现

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头

C++实现数据结构—顺序队列

本文主要是用C++实现一个简单的顺序队列,并且有如下的函数: (1)初始化顺序队列; (2)数据元素入队; (3)数据元素出队; (4)读队头元素; (5)判定队列空/满; (6)销毁顺序队列

qq_63058205的博客 1076

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1259

矢量量化的基本原理:高效数据压缩与信息检索的关键矢量量化(Vector Quantization,简称VQ)是一种数据压缩和信

此外,在矢量量化过程中,可能会引入一定的信息损失,对一些精细特征的表示可能存在一定的误差。它通过将高维数据映射到低维码本空间中,并将相似的数据映射到相同的码本向量中,实现对数据的高效表示和存储。最重要的是,矢量量化可以用于数据的检索和分析,提供了高效的数据查询和处理手段。通过使用码本索引,我们可以高效地存储和检索大量的数据。在图像处理中,矢量量化可以用于图像压缩,将复杂的图像数据转化为较少的码字,实现图像的存储和传输。矢量量化通过将连续的高维数据分割并映射到有限的码本集合中,实现数据的离散表示和压缩。

m0_70886513的博客 1373

C++数据结构——顺序队列(基本代码实现与案例)

#include<iostream> using namespace std; enum error_code{ success,overflow,underflow }; class queue{ public: queue(int len); bool empty()const; bool full()const; error_code get_front(int &x)const; error_code append(const int x); er

eyes++的博客 1243

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 682

数据结构循环队列C++实现

1.队列的概念 队列只允许在表的一端插入,另一端删除。允许插入的一端叫做队尾,允许删除的一端叫做对首。队列的特性叫“先进先出”。和栈一样,队列的存储形式也有两种,基于数组的存储表示和基于链表的存储表示。本文先实现基于数组的存储队列,也叫顺序队列。在顺序队列中设置两个指针,front和rear,front指示队头的位置,rear指示队尾的位置(说是指针,实际仍不是c语言的指针*,而是类似下标或索引的作用)。如下图所示: 当队列为空时,front=rear=0; 有新元素入队时,先将新元素添加到rea

Brillian123的博客 3132

百度飞桨EasyDL图像分类:收费口车辆类型自动识别

车辆类型识别在高速收费路口的应用中,场景相对单一且拍摄角度一致,因此首次训练模型效果优异,准确率达到了95%,鉴于市面上的车辆类型不断更新迭代且部分车辆的主要特征也不断发生变化,因此可在模型投入应用后,持续收集模型实际运行过中产生的数据,定期添加数据进行模型迭代,保证模型效果。企业将AI模型应用到实际场景中以实现停车费用、过路费用的自动计算,在收费口中由相机对每个车辆进行拍摄,拍摄到的图片传输到预测设备上进行类型识别,基于识别出来的车辆类型自动进行费用计算。该功能可在发起训练时选选择对应的开关打开即可。..

PaddlePaddle 1670

正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真

调节方波信号的占空比,也就是改变输出信号的高低电平时间比例,可以设置电容不同的充放电时间来达到目的,RP2可以使得电容具有不同的充放电时间,其中二极管起到限制电流流向的作用。假设U+>U,那么输出端就达到正向饱和,电容开始充电,当电容电压大于同相输入端电压时,此时电容开始放电,由此往复,从而产生方波信号。3,正反馈支路占优势,电路开始起振并不是稳定的,振荡会不断增大,最终将导致运放饱和,输出的波形是削波失真的正弦波。通常在电路中引入负反馈,例如使用负温度系数的热敏电阻,以自动稳定增益,防止输出波形失真。

XU157303764的博客 5321

循环队列

        队列是一种只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表(头删尾插),它的存储方式分为顺序队或链队,以循环队列更常见。       这里仅介绍顺序队以及顺序队存在的假溢出缺陷,进而引出循环队列。顺序队列                在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径----采用循环...

smile_zhangw的博客 5万+

【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法

相比C文本类编程语言,Simulink图形化编程语言的优势是逻辑思路和数据流清晰了很多,劣势是程序执行的时序不明确,而且各个模块的配置使编程的灵活度下降了不少,在使用习惯上面总感觉有各种限制。本文就是拆解Simulink中最基础的几个编程模块,发扬它的优势,避开劣势。

Mr.Cssust的博客 3851

数据结构---队列(代码实现)

int rear;* }SqQueue;*设立一个队首指针front,一个队尾指针rear,分别指向队首和队尾元素。*初始化:front=rear=0.入队:将新元素插入到rear指向的位置,然后在加1.出队:删除front指向的元素,然后加1,并返回删除的元素队列为空:front=rear。队列为满:rear=MAX_QUEUE_SIZE-1或front=rear*在非空队列里,队首指针始终指向队头元素,而队尾指针始终指向队尾元素的下一个位置。

jie18894575860的博客 594

【AUTOSAR-IpduM】-3.1-配置一个发送Tx Dynamic Container PDU(Multiple-PDU)

手把手教您如何配置一个Tx Dynamic Container PDU(Multiple-PDU),动态容器复用帧。并附上测试LOG帮助您进一步加深理解。

「汽车电子助手」的博客 1770

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2995

数据结构小记【Python/C++版】——队列篇

数据结构基础

程序员与背包客_CoderZ 833

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

队列

一、队列初探队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作。其中,插入元素(即入队列)的一端为队尾(rear),删除元素的一端为队头(front)。与栈不同的是,队列是一种先进先出的线性表,简称FIFO。假设队列q = (a1, a2, …, an),那么a1为队头,an为队尾。如下图所示: 二、顺序队列的不足假设我们有队列q = (a1, a2, …, an),顺序队列需要建

iFuMI的博客 1026

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

队列的定义: 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列的抽象数据类型: ADT 队列(Queue) Data 同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。 Operation InitQueue(*Q): 初始化操作,建立一个空队列。 DestroyQueue(*Q): 若队列Q存...

weixin_34353714的博客 210

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数据结构基础-队列(循环队列、链式队列)以及STL中queue的使用

对于队列(Queue)是什么,再次不再赘述,与链表、栈的实现一样,队列作为一种特殊的线性表,也存在顺序存储以及链式存储两种方式。 顺序存储的队列 采用顺序存储的方式来存储队列,最简单的方式是对于n个元素的队列,开辟一个n大小的数组,入队操作即是在数组的尾部直接添加元素,出队操作即将0方向的元素移除,并将所有的后边元素全部前移一个,这与顺序表操作是一致的,但是自然会很麻烦,因此,又出现了另一...

MirrorN的博客 2647

数据结构复习<4> 循环队列的顺序存储和连接存储

队列的定义 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。插入的一端称为队尾,删除的一端称为队头。 队列具有“先进先出”的特性,如下图所示: 队列的顺序存储结构及其实现 设置队头队尾指针,减少时间开销。 采用循环队列,解决假溢出问题。 队空和队满的判定问题 初始化空队时,令front = rear = 0 , 当队空时:front = rear。 当队满...

郑皓云的博客 552
上一篇: 数据结构--用C++实现顺序表
下一篇: 链队列介绍及其C++实现
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值