循环队列C++实现

C++实现循环队列(数组模拟)【保姆级讲解】 看起来还不错,但仔细观察出队到队空时,队列里面没有数了,也就是队空了,可以继续加数据,但是,表示队列头尾的变量已经到了数组的最右边的下一个索引,已经没办法再往右了,同时数组还是空的。这里可以将数组的一个格子空出来,当数组还有一个格子的时候,就当作队列已经满了。出队的话,可以利用和入队类似的办法,但数组无法删除元素,但我们可以用一个数组索引的变量表示队头的位置,每次出队只需把这个索引向递增即可。这样看起来可以,但是有一个问题,我们需要时刻记得我们入队了几次,否则就无法根据索引入队了。没有到达数组末尾的时候, 阅读详情

circularQueue.h

#pragma once
#pragma once
#ifndef CIRCULARQUEUE_H
#define CIRCULARQUEUE_H

#include<iostream>
#include<ostream>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
template<class T>  class cirQueue;

template<typename T>
class cirQueue
{
public:
	cirQueue(int sz);
	~cirQueue();
	void push(const T& elem);//进队
	void pop(T& elem);//出队
	bool empty();//查看队列是否为空
	int getSize();//返回队列中元素的个数
	void clearQueue();//清空队列中的元素
	void print();//打印队列中的元素
	int getfront() { return front; }
	int getrear() { return rear; }
	bool getTop(T& elem);//读取队列首个元素

	template<typename T>
	friend ostream& operator<<(ostream& os, cirQueue<T>& queue);

private:
	bool _full()const;//判断队列是否已满
	int maxsize;//队列最大的空间
	T* element;//存放于队列中的元素数组
	int front;//模拟队头指针
	int rear;//模拟队尾指针
};


template<typename T>
cirQueue<T>::cirQueue(int sz) {
	maxsize = sz;
	element = new T[maxsize];
	if (element == nullptr)
		cout << "内存分配失败" << endl;
	front = 0;
	rear = 0;
}


template<typename T>
cirQueue<T>::~cirQueue() {
	if (element != nullptr)
		delete element;
}

//进队
template<typename T>
void cirQueue<T>::push(const T& elem) {//需要保证队尾指针位置与首个元素相差一个位置
	if (rear > (maxsize - 1))
		rear -= maxsize ;
	if (front > (maxsize - 1))
		front -= maxsize ;
	if (!_full()) {//队列未满的情况		
		element[rear++] = elem;//队尾向后移动一位
		//++rear;
	}
	else {
		cout << "队列已满,不能插入!" << endl;
		return;
	}
}

//出队
template<typename T>
void cirQueue<T>::pop(T& elem) {
	if (rear > (maxsize - 1))
		rear -= (maxsize - 1);
	if (front > (maxsize - 1))
		front -= (maxsize - 1);
	if (!empty()) {//队列未空的情况
		elem = element[front++];//队头向后移动一位
		element[front - 1] = 0;//置零
	}
	else {
		cout << "队列已空!" << endl;
		return;
	}
}

//查看队列是否为空
template<typename T>
bool cirQueue<T>::empty() {
	if (front == rear)//待定
		return true;
	return false;
}

//返回队列中元素的个数
template<typename T>
int cirQueue<T>::getSize() {
	int num = 0;
	if (front <= rear)
		return rear - front;
	else
		return maxsize - front + rear + 1;
}

//清空队列中的元素
template<typename T>
void cirQueue<T>::clearQueue() {
	if (!empty())
	{
		int Index = 0;
		while (front < rear) {//front逼近rear
			element[front++] = 0;
			if (front == rear)
				return;
		}
		if (rear < front) {
			while (front <= maxsize - 1)//删除front至数组尾端的数据
				element[front++] = 0;
			front -= maxsize;
			while (front < rear) {//删除front至rear的数据
				element[front++] = 0;
				if (front == rear)
					return;
			}
		}
	}
}

//打印队列中的元素
template<typename T>
void cirQueue<T>::print() {//与clearQueue函数原理一致,将front替换为Index
	if (!empty())
	{
		int Index = front;
		while (Index < rear) {
			cout << element[Index++] << " ";
			if (Index == rear) {
				cout << endl;
				return;
			}
		}
		if (rear < Index) {
			while (Index <= maxsize - 1)
				cout << element[Index++] << " ";
			Index -= maxsize;
			while (Index < rear) {
				cout << element[Index++] << " ";
				if (Index == rear) {
					cout << endl;
					return;
				}
			}
		}
	}
}

//读取队列首个元素
template<typename T>
bool cirQueue<T>::getTop(T& elem) {
	if (!empty()) {
		elem = element[front];
		return true;
	}
	return false;
}

template<typename T>
ostream& operator<<(ostream& os, cirQueue<T>& queue) {
	os << "队列中的元素数量为:" << queue.getSize() << endl;
	return os;
}

//判断队列是否已满
template<typename T>
bool cirQueue<T>::_full()const {
	if (front - rear == 1 || front - rear == -maxsize + 1)
		return true;
	return false;
}

#endif // !CIRCULARQUEUE_H

main.cpp

#include"CircularQueue.h"


int main()
{
	cirQueue<int> cq(20);
	int a = 0;
	for (int i = 0; i < 19; i++)
	{
		cq.push(i);
	}
	cq.print();
	cout << cq;
	for (int i = 0; i < 20; i++)
	{
		cq.pop(a);
	}
	cout << cq;//此时front=rear=19
	cout << cq.getfront() << "   " << cq.getrear() << endl;
	//for (int i = 19; i < 25; i++)
	//{
	//	cq.push(i);
	//}
	cq.push(19);
	cq.print();
	cout << cq.getfront() << "   " << cq.getrear() << endl;
	cout << endl << endl;
	cq.push(20);	
	cq.getTop(a);
	cout << a << endl;
	cq.print();
	cout << cq.getfront() << "   " << cq.getrear() << endl;
	return 1;
}

 

循环队列的C++实现以及假溢出的解决方法 在上篇《队列的C++实现》中已经介绍了一种假溢出的解决方案:当数据出队时,将数据整体向前移动,这样就会不会出现假溢出。 另一种方案是:将数组看成循环的,这样的话,即使尾端数据已经塞满,但是由于结构是循环的,可以继续将队头的空位当作队头插入数据,从而解决假溢出。 如何判断队列是空还是满?有俩种方法:1.设置标志位,当插入数据之后遇到top==end,标志队列是满,flag=1;如果删除数据遇到t 阅读详情

相关推荐

C++实现circular queue循环队列(使用数组)(附完整源码)

C++实现circular queue循环队列使用数组C++实现circular queue循环队列(使用数组)算法完整源码(实现,main函数测试) C++实现circular queue循环队列(使用数组)算法完整源码(实现,main函数测试) #include <iostream> using namespace std; int queue[10]; int front = 0; int rear = 0; int count = 0; void Enque(int x) {

希望我的博客,能帮上你解决学习中工作中所遇到的问题 820

循环队列的C++实现

头文件:CircleQueue.hpp。

m0_73678116的博客 206

【论文精读】DisCo: Graph-Based Disentangled Contrastive Learning for Cold-Start Cross-Domain Recommendat

源域中具有相似偏好的用户在目标域中可能会表现出不同的兴趣。因此,直接迁移嵌入可能会引入不相关的源域协同信息。提出了一个基于图的解耦对比学习框架,以捕捉细粒度的用户意图并过滤掉不相关的协同信息,从而避免负迁移。 具体而言,对于每个域,我们使用多通道图编码器来捕捉多样化的用户意图。然后,我们在嵌入空间中构建亲和图,并执行多步随机游走以捕捉高阶用户相似性关系。将一个域视为目标域,我们提出了一种以用户相似性为指导的解耦意图对比学习方法,以优化跨域的用户意图桥接。

qq_52342142的博客 1227

带你一步步用C++实现循环队列

C++实现循环队列前言1.什么时候循环队列为空2.Push()操作(1)何时队列满了?(2)当队列满了,怎样扩大队列?(3)std::copy()的用法3.队列中现有多少个元素怎么算4.其他成员函数5.实例代码及运行结果:思考:总结 前言 有关队列的介绍,如队列的常用操作,循环队列和链式队列的优缺点对比等,可参考队列简介及常用操作 创建一个Queue类,确定成员函数和数据成员 template <typename T> class Queue { Queue(int _capacity = 1

weixin_43744293的博客 4014

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1124

手把手教你利用qemu搭建银河麒麟V11 arm环境

在Windows环境下,初学者或企业用户常通过VMware、VirtualBox等虚拟机软件安装Ubuntu、Red Hat等Linux系统,这类工具更侧重X86等复杂指令集架构(CISC,常见于Intel、AMD处理器)的虚拟化。而QEMU是一款开源的虚拟机监视器与模拟器,核心优势在于可模拟ARM、MIPS、RISC-V等精简指令集架构(RISC)的处理器并提供虚拟化能力,更适合对虚拟化技术有一定了解的用户。可能是电脑性能问题,安装过程比较慢,需要耐心等待。等操作系统下载完成后,进行安装了。

huanhuanzhou blog 2455

C++实现一个循环队列

C++实现一个循环队列demo

boss-dog 722

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2783

C/C++ 循环队列实现(完整代码)

循环队列比单链表实现队列会稍微要难理解一点,但是弄懂了其中的原理,就不会感觉到困难啦~~~ 循环队列的结构体:用count来记录元素的个数容易判断队列是否是空或者满。 typedef struct queue{ int count; //记录元素个数 int front; //队首 int rear; //队尾 int data[MAX_S...

SanpTap的博客 2万+

从零到一:YOLOv11高帧率模型在RDK X5上的ONNX转换与部署实战

本文详细介绍了将最新的YOLOv11高帧率模型部署到地平线RDK X5开发板的完整实战流程。内容涵盖从PyTorch模型导出ONNX、地平线工具链环境配置与模型量化编译,到编写高效的板端推理代码,并针对高帧率目标进行了后处理优化。通过实战避坑指南,帮助开发者在RDK X5上实现30FPS以上的实时目标检测。

weixin_29089057的博客 139

从 Chat 提示词到可运行 Fiori 应用,ADT for VS Code 正在把 RAP 开发带进 Agent 时代

本文探讨了在VS Code中使用AI辅助进行ABAP RAP开发的新模式。文章指出,传统RAP开发需要手工创建数据库表、CDS视图、行为定义等十多个关联对象,命名和关联关系容易出错。现在通过GitHub Copilot Agent Mode配合ADT MCP Server,开发者可用自然语言描述业务场景直接生成完整的RAP业务对象。这种生成式开发的核心价值在于:1)通过标准化工具接口(MCP)连接ABAP后端,确保生成符合规范的RAP对象;2)能正确处理多实体组合场景下的命名一致性和关联关系;3)保持生成结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 85

C++实现循环队列

今天实现循环队列遇到了一个问题,数组里面有一个位置始终空着,不知道咋把整个数组完全用上... 一下是我的代码: #include <iostream> #include <malloc.h> #include <cstdlib> #define MAX_SIZE 5 using namespace std; typedef int ElmeType; typ...

a792686200的博客 669

【STM32系统及仿真】基于STM32+蓝牙设计的智能窗帘系统__资料编号8

本项目设计并实现了一种基于STM32单片机的智能窗帘系统,集成了光敏传感器、温湿度传感器、蓝牙模块和OLED显示屏,实现了窗帘的自动调节、环境监测和远程控制功能。系统采用STM32F103C8T6作为主控制器,通过光敏传感器检测环境光强,温湿度传感器监测室内环境,蓝牙模块实现与手机APP的通信,用户可以通过APP远程控制窗帘的开合状态。系统在检测到环境光照强度或温度超出设定范围时,可自动调节窗帘的开合,以达到节能和提高舒适度的目的。

嵌入式阿齐Archie 2万+

使用c++模板实现循环队列

使用c++模板实现循环队列

mshylf的博客 1099

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++类模板实现循环队列

以下是本人用C++类模板实现的一种数据结构——循环队列。希望对人们有所帮助,也希望人们提出宝贵的意见! //循环队列 #ifndef _QUEUE_H_INCLUDED #define _QUEUE_H_INCLUDED template class _queue {     public:         _queue(size_t _capacity = 1):

ljianhui的专栏 4149

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

循环队列的C++实现与解析(数组实现)

maxsize:定义队列的最大容量为10elemtype:元素类型定义,这里为int类型sq_queue:队列结构体,包含::存储队列元素的数组front:队头指针,指向队头元素rear:队尾指针,指向队尾元素的下一个位置循环队列是一种高效的队列实现方式,特别适合于已知最大容量且需要频繁进行入队和出队操作的场景。虽然存在一定的空间浪费和容量固定的限制,但在很多实际应用中,这些限制是可以接受的。

m0_75082047的博客 676

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++实现循环队列&链队列(详解循环队列队头指空)

C++实现循环队列(详解队头指空) 循环队列.hpp #include <iostream> using namespace std; const int MAXSIZE = 1024; template <class T> class CircleQueue { public: CircleQueue() { front = rear = 0; }; void EnQueue(T data); T DeQueue(); T GetFront() { if (rear

qq_36028321的博客 461

C++实现顺序循环队列和链式队列

C++实现顺序循环队列和链式队列 语言这个东西不用真的会忘, 我记得前前后后C++的基本语法我也看了好几遍了,一直没有动手写过什么东西,所以一遍遍的看,一遍遍的忘… … 正好最近在看数据结构,想着自己用C++来实现一下,一方面是熟悉整个逻辑过程,加深对数据结构的理解,另一方面,也熟悉一下C++。 顺序存储循环队列 栈是“先进后出”(FIFO)的结构,与之相反,队列是“先进先出”(FIFO)结构,就比如我们在一个窗口排队打饭,那么先排队的人一定先打好饭(当然,要排除插队的情况)。 如上图所示,如果还有

weixin_42133358的博客 719

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

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

Brillian123的博客 3131

循环队列 c++ 模板实现

循环队列 c++ 模板实现 #include<iostream> using namespace std; template<class T> class sqqueue { private: T *data; int front;// 头指针 int rear;// 尾指针 int maxsize; public: sqqueue(int n); /...

卖核弹的小男孩 的博客 293
上一篇: 链栈C++实现
下一篇: 二叉链表C++实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值