循环队列_数组实现

在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素

移动,但是也带来了一个新的问题"假溢出"。

可采用循环队列

cpp 复制代码
// 循环队列
typedef struct Queue{
	DataType queue[MaxSize]; //存储数据的数组
	int front;  //循环队头指针
	int rear;  //循环队尾指针
}CircularQueue;

CircularQueue CQ;

循环队列入队

队尾循环后移: CQ->rear =(CQ->rear+1)%MaxSize;

循环队列出队

队首循环后移: CQ->front =(CQ->front+1)%MaxSize;

队空:

CQ.front=CQ.rear; // CQ.rear 和 CQ.front 指向同一个位置

队满:

(CQ.rear+1) %MaxSize=CQ.front; // CQ.rear 向后移一位正好是 CQ.front

计算元素个数:

可以分两种情况判断:

  1. 如果 CQ.rear>= SQ.front:元素个数为 CQ.rear-CQ.front;
  2. 如果 CQ.rear<SQ.front:元素个数为 CQ.rear-CQ.front+ MaxSize;
    采用取模的方法把两种情况统一为:(CQ.rear-CQ.front+MaxSize)% MaxSize
cpp 复制代码
#include <iostream>
#include <iomanip>

#define MaxSize 5  //循环队列的最大容量

using namespace std;  //循环队列中元素类型

typedef int DataType;

// 循环队列
typedef struct Queue{
	DataType queue[MaxSize]; //存储数据的数组
	int front;  //循环队头指针
	int rear;  //循环队尾指针
}CircularQueue;

//队列初始化,将循环队列初始化为空队列
void InitQueue(CircularQueue* CQ) {
	if (!CQ) { return; }
	//把对头和队尾指针同时置 0
	CQ->front = CQ->rear = 0;
}

//判断队列为空
bool IsEmpty(CircularQueue* CQ) {
	if (!CQ) { return false; }

	if (CQ->front == CQ->rear)
	{
		return true;
	}
	return false;
}

//判断循环队列是否为满
bool IsFull(CircularQueue* CQ) {
	if (!CQ) { return false; }

	if ((CQ->rear + 1) % MaxSize == CQ->front) {
		return true;
	}
	return false;
}

//入队,将元素 data 插入到循环队列 SQ 中
bool EnterQueue(CircularQueue* CQ, DataType data) {
	if (!CQ ){ return 0; }
	if(IsFull(CQ)) {
		cout <<"无法存入: "<<data<< " 队列已满!!! " << endl;
		return 0;
	}

	CQ->queue[CQ->rear] = data;
	CQ->rear = (CQ->rear + 1) % MaxSize;; //队尾指针循环后移一位
	return 1;
}

//出队,将队列中队头的元素 data 出队,出队后队头指针 front 后移一位
DataType DeleteQueue(CircularQueue* CQ, DataType* data){
	if (!CQ || IsEmpty(CQ))
	{
		cout << "循环队列为空!" << endl;
		return 0;
	}

	*data = CQ->queue[CQ->front];
	CQ->front = (CQ->front + 1) % MaxSize;
	return *data;
}

//获取队列中元素的个数
int getLength(CircularQueue* CQ) {
	if (!CQ) { return 0; }

	return(CQ->rear - CQ->front + MaxSize) % MaxSize;
}

//打印队列中的各元素
void PrintQueue(CircularQueue* CQ) {
	if (!CQ) { return; }

	string str(50, '-');
	cout << str << endl;

	cout << "循环队列:";
	int i = CQ->front;
	while (i != CQ->rear) {
		cout << setw(2) << CQ->queue[i] << " ";
		i = (i + 1) % MaxSize;
	}
	cout << endl << endl;
}

int main() {
	CircularQueue *CQ = new CircularQueue;
	DataType data = -1;

	InitQueue(CQ);

	for (int i = 1; i < 7; i++) {
		EnterQueue(CQ, i);
	}
	PrintQueue(CQ);

	cout << "出队列元素: " << DeleteQueue(CQ, &data) << endl;
	cout << "出队列元素: " << DeleteQueue(CQ, &data) << endl;	
	EnterQueue(CQ, 88);
	EnterQueue(CQ, 66);
	PrintQueue(CQ);

	cout << "队列元素个数: " << getLength(CQ) << endl;
	system("pause");
	return 0;
}
相关推荐
wabs66611 分钟前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
hans汉斯13 分钟前
人工智能与机器人研究|面向无标签数据的三维场景语义理解方法研究
人工智能·神经网络·算法·信息可视化·cnn·机器人
奇树谦21 分钟前
ZeroMQ 详解:轻量级高性能消息通信框架及 C++ 使用示例
开发语言·c++
不相心 -w-22 分钟前
现代C++——智能指针
开发语言·c++
爱和冰阔落26 分钟前
【Linux】从匿名管道到进程池:任务派发、fd 继承 Bug 与完整实现
android·linux·运维·c++
TunerT_TQ36 分钟前
Valhalla 静态工程审阅 #021|华为MindSpore 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·github·mfc·#大模型开源·#华为开源·#深度学习
小程故事多_8010 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_9561219712 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-14 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
AndrewHZ15 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发