vector实现循环队列

顺序队列

       顺序队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。因为其入队和出队操作均是(front/rear)指针向后移动,以进行结点的链接和删除,这就造成其使用空间不断向出队的那一边偏移,当出队入队次数频繁时,尾指针移动到我们可以进行队列操作的范围之外去了,则会产生假溢出。

(当使用动态链表创建顺序队列,其向后继续不断的申请内存空间,即使前面出队操作释放掉了前面的空间,但是指针依旧会向后进行移动,直到达到系统预留给程序的内存上界被强行终止)。

循环队列

        循环队列就是为了解决顺序队列的“假溢出”问题,即将顺序队列臆造为一个环状的空间。循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。

        但是循环队列中存在一个问题,在循环队列中只凭头指针front等于尾指针rear无法判别队列空间是“空”还是“满”,可有两种处理方法:

     (一)设置队列元素个数成员,以区别队列是“空”还是“满”;

     (二)front指针表示为虚拟头指针,即不指向元素,队列的实际元素数量要比队列空间maxsize少一个,如下图所示,队列总长度为8,实际元素个数为7个,还有一个被front指针使用。

(一)设置队列元素个数成员,以区别队列是“空”还是“满”;

// vector实现循环队列#include<iostream>
#include<vector>
using namespace std;class cirQueue
{
public:int maxsize;int front;int rear;int count;vector<int> data;public:cirQueue(){this->count = 0;this->maxsize = 8;this->front = 0;this->rear = 0;for(int i=0; i<maxsize; i++){this->data.push_back(0);}}cirQueue(int maxsize):count(0),maxsize(maxsize),front(0),rear(0){for(int i=0; i<maxsize; i++){this->data.push_back(0);} }void push_cirQueue(int data);void pop_cirQueue();void show_cirQueue();
};// 入队
void cirQueue::push_cirQueue(int val){//满了(rear的下一个元素是front),再继续就溢出 if( (this->rear+1)%maxsize == this->front ){cout<<"the cirQueue is full!"<<endl;}//从rear加入元素else{// 判断队列是否为空if(this->count == 0){this->data[this->rear] = val;}else{this->rear = (this->rear+1)%maxsize;this->data[this->rear] = val;    }this->count++;}
}// 出队
void cirQueue::pop_cirQueue(){//判断队列是否为空if(this->count == 0){cout<<"the cirQueue is empty!"<<endl;}//front出队else{this->data[this->front] = 0;this->front = (this->front+1)%maxsize;}this->count--;
}void cirQueue::show_cirQueue(){if(this->count == 0){cout<<"the cirQueue is empty!"<<endl;}else{int cur = this->front;cout<<this->data[cur]<<", ";while(cur != this->rear){cur = (cur+1)%maxsize;cout<<this->data[cur]<<", ";}cout<<endl;}
}int main()
{cirQueue myCirQueue(5);myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;myCirQueue.push_cirQueue(1);myCirQueue.push_cirQueue(2);myCirQueue.push_cirQueue(3);myCirQueue.push_cirQueue(4);myCirQueue.push_cirQueue(5);myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;myCirQueue.push_cirQueue(6);myCirQueue.show_cirQueue();myCirQueue.pop_cirQueue();myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;return 0;
}

 

(二) front指针表示为虚拟头指针,即不指向元素,

// vector实现循环队列#include<iostream>
#include<vector>
using namespace std;class cirQueue
{
public:int maxsize;int front;int rear;int count;vector<int> data;public:cirQueue(){this->count = 0;this->maxsize = 8;this->front = 0;this->rear = 0;for(int i=0; i<maxsize; i++){this->data.push_back(0);}}cirQueue(int maxsize):count(0),maxsize(maxsize),front(0),rear(0){for(int i=0; i<maxsize; i++){this->data.push_back(0);} }void push_cirQueue(int data);void pop_cirQueue();void show_cirQueue();
};// 入队
void cirQueue::push_cirQueue(int val){//满了(rear的下一个元素是front),再继续就溢出 if( (this->rear+1)%maxsize == this->front ){cout<<"the cirQueue is full!"<<endl;}//从rear加入元素else{this->rear = (this->rear+1)%maxsize;this->data[this->rear] = val;this->count++;}
}// 出队
void cirQueue::pop_cirQueue(){//判断队列是否为空if(this->front == this->rear){cout<<"the cirQueue is empty!"<<endl;}//front出队else{this->data[this->front] = 0;this->front = (this->front+1)%maxsize;}this->count--;
}void cirQueue::show_cirQueue(){if(this->front == this->rear){cout<<"the cirQueue is empty!"<<endl;}else{int cur = this->front;while(cur != this->rear){cur = (cur+1)%maxsize;cout<<this->data[cur]<<", ";}cout<<endl;}
}int main()
{cirQueue myCirQueue(5);myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;myCirQueue.push_cirQueue(1);myCirQueue.push_cirQueue(2);myCirQueue.push_cirQueue(3);myCirQueue.push_cirQueue(4);myCirQueue.push_cirQueue(5);myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;myCirQueue.push_cirQueue(6);myCirQueue.show_cirQueue();myCirQueue.pop_cirQueue();myCirQueue.show_cirQueue();cout<<"front:"<<myCirQueue.front<<" rear:"<<myCirQueue.rear<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据结构简介

首先对redis来说&#xff0c;所有的key&#xff08;键&#xff09;都是字符串。我们在谈基础数据结构时&#xff0c;讨论的是存储值的数据类型&#xff0c;主要包括常见的5种数据类型&#xff0c;分别是&#xff1a;String、List、Set、Zset、Hash。 1.粉丝福利 最新很多同学问…

使用SQL和Python处理Excel文件数据

目录 一、引言 二、使用SQL查询Excel文件数据 1、导入必要的库 2、创建数据库连接 3、读取Excel文件数据 4、将数据写入数据库 5、使用SQL查询数据 三、使用Python读取和处理Excel文件数据 1、导入必要的库 2、读取Excel文件数据 3、数据处理和分析 4. 将数据可视化…

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…

【网络安全】—计算机网络基础

文章目录 网络必备基础物理层数据链路层与交换机网络模型OSI/TCP对等传输虚拟局域网VLAN静态路由与配置网络地址转换NAT访问控制列表ACLIP协议与IP地址分类子网掩码网关子网划分总结 计算机网络是指将地理位置不同的、功能独立的多台计算机通过通信线路连接起来&#xff0c;以功…

echarts地图map鼠标移入区域颜色(渐变)

鼠标移入透明 itemStyle下 emphasis属性 itemStyle: {// # 在未设置dataRange或 visualMap时设置有效normal: {// borderColor: rgba(12, 222, 255, 1),// borderWidth: 0.8,areaColor: {type: linear-gradient,x: 0,y: 300,x2: 0,y2: 0,colorStops: [{offset: 0,color: rg…

Unix进程间通信之简介-总体概述和引子

目录标题 0. 前言1. 概述2. 进程、线程与信息共享3. IPC对象的持续性4. 名字空间5. fork、exec和exit对IPC对象的影响6. 出错处理&#xff1a; 包裹函数7. Unix标准8. 小结 0. 前言 进程间通信这块是学习linux-c编程的关键&#xff0c; 这篇为后续进程间通信技术的引子篇&#…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

Gitee基础知识

目录 1-gitee 1.1gitee介绍 1.2git与gitee的关系 1.3在国内为什么选择Gitee 2-注册与创建远程仓库 2.1注册 2.2创建远程仓库 2.3配置ssh公钥 2.3.1公钥的生成方法&#xff1a; 2.3.2 在gitee中配置公钥 2.3.4验证公钥 3-添加与推送远程仓库master 3.1基本命令…

【1.9计算机组成与体系结构】总线

目录 1.总线的定义2.总线的分类 1.总线的定义 √ 总线是一组能为多个部件分时共享的公共信息传送线路。 &#x1f535; 共享 &#x1f535; 分时:是指同一时刻仅允许一个部件向总线发送信息&#xff0c;但允许多个部件同时从总线上接收相同的信息。 √ 串行总线 (适合长距离传…

软件开发模型(架构师复习资料)

在计算机刚刚诞生的年代&#xff0c;计算机是一种只有天才才能掌握的工具。人们对软件的认知仅仅停留在程序的层面上&#xff0c;所谓的软件开发就是那些能够掌握计算机的天才们写的一些只有计算机才能理解的二进制序列。但随着技术的发展&#xff0c;软件的复杂度不断提高&…

《ThreadLocal使用与学习总结:2023-12-15》史上最详细由浅入深解析ThreadLocal

由浅入深全面解析ThreadLocal 目录 由浅入深全面解析ThreadLocal简介基本使用ThreadLocal与synchronized的区别ThreadLocal现在的设计&#xff08;JDK1.8&#xff09;ThreadLocal核心方法源码分析ThreadLocalMap源码分析弱引用与内存泄露&#xff08;内存泄漏和弱引用没有直接关…

3.3 右值引用:移动语义与完美转发

一、移动语义的引入 1.浅拷贝带来的问题 对于存在资源(文件&#xff0c;指针)类型成员的类对象&#xff0c;在执行拷贝的时候存在资源管理的问题&#xff0c;这是浅拷贝导致的。 此时我们可以重写拷贝构造实现深拷贝&#xff0c;解决资源管理的问题。 但是有的时候拷贝并不…

【QT】QDockWidget控件的使用

目录 1.概述 2.常用函数介绍 3.QDockWidget布局相关 4.QDockWidget的使用注意事项 5.使用场景 6.简单应用示例代码 1.概述 QDockWidget类提供了一个小部件&#xff0c;可以停靠在QMainWindow中&#xff0c;也可以作为桌面上的顶级窗口浮动。 QDockWidget提供了dock Widg…

EMC测试与整改实践?|深圳比创达电子

电磁兼容(EMC)测试和整改是当今社会对电磁兼容(EMC)意识日益深入的表现&#xff0c;EMC测试与整改随着社会对电磁环境要求的不断提高&#xff0c;越来越受到重视&#xff0c;下面就EMC测试与整改实践进行一下详细介绍。 一、什么是EMC测试&#xff1f; EMC测试是指在一定的电…

减速机振动相关标准 - 笔记

参考标准&#xff1a;国家标准|GB/T 39523-2020 减速机的振动标准与发动机不同&#xff0c;摘引&#xff1a; 原始加速度传感器波形 可以明显看到调幅波 它的驱动电机是300Hz~2000Hz范围的。这个采样时间是5秒&#xff0c;看分辨率至少1024线。可分出500条谱线。 频谱部分 …

干货分享 | 如何在TSMaster中对常用总线报文信号进行过滤?

TSMaster软件平台支持对不同总线&#xff08;CAN、LIN、FlexRay&#xff09;的报文和信号过滤&#xff0c;过滤方法一般有全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤&#xff0c;针对不同的总线信号过滤器的使用方法也基本相同。今天重点和大家分享一下关于T…

魔众文库系统v5.8.0版本发布:水印、分类与移动端升级,打造更高效文档管理体验

魔众文库系统迎来了全新的v5.8.0版本更新&#xff01;此次更新不仅对水印功能进行了升级&#xff0c;还新增了辅助分类样式&#xff0c;同时优化了移动端体验。让我们一起来看看这次更新的亮点吧&#xff01; 一、水印功能全新升级 在v5.8.0版本中&#xff0c;魔众文库系统的…

Spring学习?这一篇文章就够,史上最全!

文章目录 前言一、IOC概述及底层原理1.概述和原理 二、思路分析三、IOC操作bean管理&#xff08;基于xml&#xff0c;使用的是IDEA2022.3.3&#xff0c;maven仓库&#xff09;1.xml实现bean管理&#xff08;1&#xff09;创建对象&#xff08;2&#xff09;注入属性&#xff08…

[HTML]Web前端开发技术3(HTML5、CSS3、JavaScript )超链接,target,scrolling,marginwidth,frameborder,iframe——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

c语言:[输出函数]与[输入函数]|要点简述

一、【输出函数】 printf() 与 puts()的不同点 1、printf()函数 printf()支持单个字符%c的输出&#xff0c;以及字符串%s的输出。 (1)如果是以%c的形式输出&#xff0c;是一个字符一个字符的输出。因此&#xff0c;要用一个循环语句&#xff0c;把字符逐个输出。 (2)而用%…