【数据结构 03】循环队列

一、原理

循环队列从功能角度具有队列的性质,即遵从先进先出原则,但是其存储方式是顺序存储。

循环队列的存储空间大小通常都是固定的,通过前指针和尾指针的移动控制循环队列数据的增删。

**特征:**顺序存储、先进先出、容量有限(循环利用)

设计理念:

  1. 初始化一个队列空间(容量为C),这是循环队列能够存储数据的最大容量数
  2. 设置头指针front和尾指针rear,刚开始时front和rear指向同一个数据存储地址
  3. 新增数据,front不动,rear指向下一个数据存储地址
  4. 删除数据,rear不懂,front指向下一个数据存储地址
  5. 为了防止front和rear越界,front和rear在每次移动之后都会对容量C取模

++当循环队列为空或为满的时候,front和rear都指向同一个位置,该如何区分呢?++

  1. 在容量为C的队列空间中,取出一个数据块空间不存储数据,用于区分队列空和队列满
  2. 此空数据块位于front的后一个地址,当rear和front之间只相隔一个数据块,即规定的空数据块时,不再新增数据
  3. 随着队列前指针front移动,空数据块也跟着移动

二、CircularQueue.h

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>

#define CAPACITY 5
// 循环队列的容量,通常循环队列存储元素的个数为容量-1

typedef int DataType;

typedef struct CirQueue
{
	DataType* data;
	int front;
	int rear;
}CirQueue;

void Init(CirQueue* cq)
{
	cq->data = (DataType*)malloc(sizeof(DataType) * CAPACITY);
	cq->front = cq->rear = 0;
}

int Empty(CirQueue* cq)
{
	return cq->front == cq->rear;
}

int Full(CirQueue* cq)
{
	return (cq->rear + 1) % CAPACITY == cq->front;
}

void Push(CirQueue* cq, DataType x)
{
	if (Full(cq))
	{
		printf("循环队列已满,push失败\n");
		return;
	}

	cq->data[cq->rear] = x;
	cq->rear = (cq->rear + 1) % CAPACITY;
}

void Pop(CirQueue* cq)
{
	if (Empty(cq))
	{
		printf("循环队列已空,pop失败\n");
		return;
	}

	cq->front = (cq->front + 1) % CAPACITY;
}

int Size(CirQueue* cq)
{
	return ((cq->rear + CAPACITY) - cq->front) % CAPACITY;
}

void Print(CirQueue* cq)
{
	if (Empty(cq))
	{
		printf("循环队列为空\n ");
		return;
	}

	int pos = cq->front;
	while (pos != cq->rear)
	{
		printf("%2d ", cq->data[pos]);
		pos = (pos + 1) % CAPACITY;
	}
	printf(",循环队列存储元素个数为:%d\n", Size(cq));
}

三、test.c

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1

#include "CircularQueue.h"

int main()
{
	CirQueue cq;
	Init(&cq);

	Push(&cq, 1);
	Push(&cq, 3);
	Push(&cq, 5);
	Push(&cq, 7);
	Push(&cq, 2);
	Push(&cq, 4);
	Push(&cq, 6);
	Push(&cq, 8);
	Print(&cq);

	Pop(&cq);
	Pop(&cq);
	Print(&cq);

	Push(&cq, 10);
	Print(&cq);

	Pop(&cq);
	Pop(&cq);
	Pop(&cq);
	Pop(&cq);
	Pop(&cq);
	Print(&cq);
}
相关推荐
白色的北极熊3 分钟前
c语言 求余运算符
c语言·数据结构·算法
by2099930 分钟前
list 的使用:把节点、位置和操作联系起来的综合叙述(上)
数据结构·c++·笔记·list
東隅已逝,桑榆非晚39 分钟前
数据结构队列
数据结构·笔记·学习
老王爱玩车40 分钟前
字符串和字符串函数
c语言·开发语言·数据结构·学习
H.莓飛1 小时前
【数据结构】二叉树
linux·数据结构·算法
梦帮科技1 小时前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
梦帮科技2 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
h_a_o777oah15 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO915 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician15 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论