【数据结构 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

#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

#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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从前有条街 脚本 辅助 跳一跳

最近沉迷从前有条街。。。即将弃坑。 天工时间长的难以忍受。还好跳一跳能获得快乐水。找了一圈没有可用的脚本&#xff0c;于是自己写。。。 autojsx编写的 需要开启辅助功能跟悬浮窗 具体自行研究。 支持自动开始 无限续盘。目前只适配了1800*2400分辨率 。花了半个小时写的…

LeetCode —— 17. 电话号码的字母组合

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

树和二叉树基础

树和二叉树基础 1.1树的概念 树是在数据结构中第一次接触到的非线性结构。 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它 叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&am…

Kotlin 协程:深入理解 ‘lifecycleScope‘

Kotlin 协程&#xff1a;深入理解 ‘lifecycleScope’ Kotlin 协程是一种强大的异步编程工具&#xff0c;它提供了一种简洁、易读的方式来处理并发和异步操作。在 Kotlin 协程库中&#xff0c;lifecycleScope 是一个关键的概念&#xff0c;它允许我们将协程的生命周期绑定到 An…

基于SSM的高校班级同学录网站设计与实现(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于SSM的高校班级同学录网站设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 项目介绍&#xff1a; Javaee项目&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

【C++】构造函数和析构函数详解

目录 前言 类中的六个默认成员函数 构造函数 概念 特性 析构函数 概念 特性&#xff1a; 前言 类中的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编…

好用的IDEA插件,免费!

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

利用二分法及不动点迭代求解非线性方程(MatLab)

一、问题描述 利用二分法及不动点迭代求解非线性方程。 二、实验目的 掌握二分法及不动点迭代的算法原理&#xff1b;能分析两种方法的收敛性&#xff1b;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。 三、实验内容及要求 二分法 (1) 编写代码计算下列数字…

1990-2021年各省绿色金融指数数据(含原始数据+测算结果)

1990-2021年全国各省绿色金融指数数据&#xff08;含原始数据结果&#xff09; 1、时间&#xff1a;1990-2021年 2、指标&#xff1a;地区、年份、该省环保项目信贷总额&#xff08;亿元&#xff09;、全省信贷总额&#xff08;亿元&#xff09;、绿色信贷、环境污染治理投资…

应用keras建立ANN模型.

介绍&#xff1a; Keras是一个开源的神经网络库&#xff0c;它基于Python语言&#xff0c;并能够在多个深度学习框架上运行&#xff0c;包括TensorFlow、Theano和CNTK。Keras提供了一种简洁而高层次的API&#xff0c;使得用户能够快速构建、训练和部署神经网络模型。 Keras的设…

【算法与数据结构】198、213、337LeetCode打家劫舍I, II, III

文章目录 一、198、打家劫舍二、213、打家劫舍 II三、337、打家劫舍III三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、198、打家劫舍 思路分析&#xff1a;打家劫舍是动态规划的的经典题目。本题的难点在于递归公式…

如何在Excel中清除单元格的格式?这里有详细步骤

Microsoft Excel提供了大量样式选项来自定义电子表格的外观。但是&#xff0c;如果你需要删除格式&#xff0c;则可以很容易地删除选定单元格和整个工作表的格式。我们将向你展示如何操作。 ​注意&#xff1a;清除格式只会删除文本的样式&#xff1b;将保留你的实际文本。 如…

Modern C++ std::get<n>(tuple)的原理

1. 前言 前面我们讲过std::tuple的实现原理&#xff0c;但没有讲如何取出数据&#xff0c;本节着重讲讲这点。本节与之前的blog有较大关联&#xff0c;如果您没看&#xff0c;这里有链接&#xff0c;链接已按由浅入深排好序&#xff0c;您可以按顺序阅读。如果时间少可以直接看…

安卓视图基础

目录 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 设置视图的宽高 设置视图的间隔 设置视图的对齐方式 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"a…

vue使用mpegts.js教程

vue使用mpegts.js教程 最简单好用的H265网页播放器-mpegts.js简介特征受限性 使用步骤安装引入HTML 中添加视频标签video知识扩展 在容器里创建播放器 最简单好用的H265网页播放器-mpegts.js H265是新一代视频编码规范&#xff0c;与H264相比压缩比更高&#xff0c;同样的码率下…

计算机网络-调度算法-2(时间片轮转 优先级调度算法 多级反馈队列调度算法 多级队列调度算法)

文章目录 总览时间片轮转时间片大小为2时间片大小为5若按照先来先服务算法 优先级调度算法例题&#xff08; 非抢占式优先级调度算法&#xff09;例题&#xff08; 抢占式优先级调度算法&#xff09;补充 思考多级反馈队列调度算法例题 小结多级队列调度算法 总览 时间片轮转 …

ESP32 LED PWM 控制器

ESP32 具有 LED PWM 控制器&#xff0c;具有 16 个独立通道&#xff0c;可配置为生成具有不同属性的 PWM 信号。 使用 Arduino IDE 通过 PWM 对 LED 进行调光时必须遵循以下步骤&#xff1a; 1.首先&#xff0c;您需要选择一个PWM通道。从 0 到 15 有 16 个通道&#xff0c;一…

初谈C++:引用

文章目录 前言概述引用特性应用场景做参数做返回值 传值、传引用效率比较引用和指针的区别 前言 在学习C语言的时候会遇到指针&#xff0c;会有一级指针、二级指针…很容易让人头昏脑胀。在C里面&#xff0c;引入了引用的概念&#xff0c;会减少对指针的使用。引用相当于给一个…

【FFmpeg】ffplay 命令行参数 ① ( 设置播放分辨率 | 禁用 音频 / 视频 / 字幕 选项 )

文章目录 一、ffplay 命令行参数 - 设置播放分辨率1、强制设置通用播放分辨率 -x -y 参数2、命令行示例 - 正常播放视频3、命令行示例 - 强制设置播放分辨率4、设置 YUV 播放分辨率 -video_size 和 像素设置 -pixel_format5、全屏播放 -fs 参数 二、ffplay 命令行参数 - 禁用 音…