循环队列--C语音实现

news2024/11/26 10:27:57

目录

一、循环队列的特点:

二、普通的队列的缺点:

三、循环队列实现原理:

四、循环队列是实现步骤:

1.循环队列的头文件: 

2.循环队列的源文件:

3.注意点: 


一、循环队列的特点:

是具有队头指针和队尾指针,指示队列元素所在的位置,避免删除元素时移动大量元素。它只能队尾插入元素、在队头删除元素,是先进先出(First In First Out)的线性表,先进入的元素出队,后进入的元素才能出队。相比普通的队列,元素出队时无需移动大量元素,只需移动头指针。循环队列适合处理用户排队等待的情况,但需要预先分配大量存储空间。其时间复杂度为读取时O(1),插入、删除时O(1)。

循环队列的优点:防止假溢出!循环队列可以有效地利用空间,避免了普通队列在出队操作后无法再次利用已出队的空间的问题。此外,循环队列还可以通过修改指针的位置实现逆序输出。 


二、普通的队列的缺点:

假溢出:前面的空间就无法利用。


三、循环队列实现原理:

是基于固定长度的数组实现。 并且会多开一个空间(区分满和空的情况)

循环队列是逻辑上循环,而不是物理上循环,物理上还是线性存储。

 我们把第二个圈当做满来看,目的是为了用front和rear来区分空和满。


四、循环队列是实现步骤:

1.创建循环链表并且初始化

2.销毁循环队列
3.队列入,出

4.判断队列是否为空

5.判断队列是否为满

6.输出队列内容(打印)

7.获取队列长度

8.获取队列头元素

9.获取队列尾元素


1.循环队列的头文件: 

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int CQDataType;
typedef struct CirQueue
{
	CQDataType* a;//指向数组的首元素
	int front;//指向头数据
	int rear;//指向尾数据的下一个位置
	int k;//实际存放的数据个数
}CQ;

//创建循环链表并且初始化
CQ* CreateQ(int n);

//销毁循环队列
void CirQueueDestry(CQ* cq);
//队列入,出
bool CirQueuePush(CQ* cq, CQDataType x);
bool CirQueuePop(CQ* cq);

//判断队列是否为空
bool CirQueueEmpty(CQ* cq);

//判断队列是否为满
bool CirQueueFull(CQ* cq);

//输出队列内容,打印
void CQPRINT(CQ* cq);

//获取队列长度
int CQSize(CQ* cq);

//获取队列头元素
CQDataType CQFrontElement(CQ* cq);

//获取队尾数据
int CirQueueRear(CQ* cq);

//销毁循环队列
void CirQueueDestroy(CQ* cq);

2.循环队列的源文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include"CirQueue.h"
//创建循环链表并且初始化
CQ* CreateQ(int n)
{
	CQ* cq = (CQ*)malloc(sizeof(CQ));
	if (cq == NULL)
	{
		perror("malloc error");
		exit(-1);
	}
	CQDataType* tmp = (CQDataType*)malloc(sizeof(CQDataType) * (n + 1));
	if (tmp == NULL)
	{
		perror("malloc error");
		exit(-1);
	}
	cq->a = tmp;
	cq->front = cq->rear = 0;
	cq->k = n;
	return cq;
}

//销毁循环队列
void CirQueueDestry(CQ* cq)
{
	free(cq->a);
	free(cq);
}
//队列入,出
bool CirQueuePush(CQ* cq, CQDataType x)
{
	if (CirQueueFull(cq))
	{
		return false;
	}
	cq->a[cq->rear] = x;
	cq->rear++;
	cq->rear %= (cq->k + 1);
	return true;
}
bool CirQueuePop(CQ* cq)
{
	if (CirQueueEmpty(cq))
	{
		return false;
	}
	cq->front++;
	cq->front %= (cq->k + 1);
	return true;
}

//判断队列是否为空
bool CirQueueEmpty(CQ* cq)
{
	return cq->front == cq->rear;
}

//判断队列是否为满
bool CirQueueFull(CQ* cq)
{
	return (cq->rear+1)%(cq->k+1) == cq->front;
}

//输出队列内容,打印
void CQPRINT(CQ* cq)
{
	int szie = CQSize(cq);
	if (cq->front > cq->rear)
	{
		for (int i = cq->front; i < cq->k+1; i++)
		{
			printf("%d ", cq->a[i]);
		}
		for (int i = 0; i < cq->rear; i++)
		{
			printf("%d ", cq->a[i]);
		}
	}
	else
	{
		for (int i = cq->front; i < cq->rear; i++)
		{
			printf("%d ", cq->a[i]);
		}
	}
}

//获取队列长度
int CQSize(CQ* cq)
{
	if (cq->front > cq->rear)
	{
		return (cq->k) - (cq->front) + (cq->rear)+1;
	}
	else
	{
		return (cq->rear) - (cq->front);
	}
}

//获取队列头元素
CQDataType CQFrontElement(CQ* cq)
{
	if (CirQueueEmpty(cq))
	{
		return -1;
	}
	return cq->a[cq->front];
}

//获取队尾元素
int CirQueueRear(CQ* cq)
{
	if (CirQueueEmpty(cq))
	{
		return -1;
	}
	return cq->a[(cq->rear - 1 + cq->k + 1) % (cq->k + 1)];
}


3.注意点: 

1.入队列:判断队列是否为满,满的时候就不能入队列

                 考虑rear++时越界,需要让它变成最小值。

2.出队列:判断队列是否为空

                  也要考虑front--时越界,也要考虑循环问题

3.判空:rear==front

4.判满:rear+1==front(也要考虑循环问题) 

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

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

相关文章

灯塔:CSS笔记(1)

CSS&#xff1a;层叠样式表 所谓层叠 即叠加的意思&#xff0c;表示样式可以一层一层的层叠覆盖 css写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下面 <!DOCTYPE html> <html lang"en"> <head><meta cha…

java 从环境变量中获取参数及值

window直接在这设置&#xff1a; linux在/etc/profile文件里存放&#xff1a; export keyvalue 然后立即生效&#xff1a;source /etc/profile 代码获取值这样获取&#xff1a; System.getenv("key");

C++初阶篇----类与对象中卷

目录 引言1. 构造函数1.1概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2特征 4. 赋值运算符重载4.1 运算符重载4.2 赋值运算符重载4.3 前置和后置重载 5.日期类的实现6.const成员7.取地址及const取地址操作符重载 引言 当一个类既没有成员变量又没有成…

【特征选择】CMA-ES(协方差矩阵适应进化策略)

导 读 当将模型拟合到数据集时&#xff0c;可能需要执行特征选择&#xff1a;由于多种原因&#xff0c;仅保留某些特征子集来拟合模型&#xff0c;而丢弃其余特征具有一定的必要性&#xff0c;如下&#xff1a; 保持模型的可解释性&#xff08;特征太多会使解释变得更加困难&am…

css-解决Flex布局下居中溢出滚动截断问题

css-解决Flex布局下居中溢出滚动截断问题 1.出现的问题2.解决方法2.1 Flex 布局下关键字 safe、unsafe2.2 使用 margin: auto 替代 justify-content: center2.3 额外嵌套一层 1.出现的问题 在页面布局中&#xff0c;我们经常会遇到/使用列表内容水平居中于容器中&#xff0c;一…

Codesys自定义库的帮助文档的美化

文章目录 1.前言2.美化的方式2.1.利用html标签2.2.利用reStructuredText 3.相关说明3.1.使用reStructuredText时&#xff0c;中文注释的问题3.2.将文档需要的图片包含到库中3.3.文档的作用区域 1.前言 当我们在codesys中写好自己的库&#xff0c;并且发布给别人使用时&#xf…

overleaf latex 笔记

overleaf: www.overleaf.com 导入.tex文件 1.代码空一行&#xff0c;代表文字另起一段 2. 1 2 3 排序 \begin{enumerate} \item \item \item \end{enumerate} 3.插入图片 上传图片并命名 \usepackage{float}导包\begin{figure}[H]&#xff1a;表示将图…

大数据最佳实践

本文主要收录一些大数据不错的实践文章 1、数禾云上数据湖最佳实践 https://blog.51cto.com/u_15089766/2601706 该文章介绍了数禾云的数据胡实践&#xff0c;包含presto以及数据湖等组件的一些部署架构&#xff0c;文章听不错的&#xff0c;里面提到了为了避免presto与yarn计…

汽车中网上的logo不能改,需要到车管所备案

需要备案。 车辆改装需到车辆管理所办理登记。 机动车每年检验时&#xff0c;需要对外观进行检测。 中国在线的标志不能更改。 汽车格栅是汽车前部进气口附近相关部件的总称。 汽车的中网主要位于水箱、发动机、空调等设备的前面&#xff0c;控制进气和通风&#xff0c;防止行…

3d怎么拖模型---模大狮模型网

在3D建模软件中拖动(移动)模型通常是一种基本的操作&#xff0c;用来调整模型的位置或布局。以下是一般情况下在3D建模软件中拖动模型的基本步骤&#xff1a; 3d拖模型的步骤&#xff1a; 选择模型&#xff1a;在3D建模软件中选中你要拖动的模型。通常可以通过单击模型来选中它…

#define MODIFY_REG(REG, CLEARMASK, SETMASK)

#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) 这个宏 MODIFY_REG 是在嵌入式编程中&#xff0c;它用于修改一个寄存器的特定位&#xff0c;而不影响其他位。这个宏接受三个参数&#xff…

无代理方式实现VMware的迁移?详细解析

在当今数字化时代&#xff0c;数据的安全性和可用性对于企业至关重要。尤其是在VMware转变订阅策略后&#xff0c;原本永久订阅的产品转变为以年付费订阅的形式&#xff0c;导致客户不得不支付更多的费用&#xff0c;大幅增加了成本。同时&#xff0c;客户也对VMware未来发展前…

鹅厂打工8年,我为啥突然裸辞?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文&#xff1a;以下文章来源于沐洒 &#xff0c;作者ASCII26 今天跟大家分享一个重磅消息&#xff0c;沐洒终于从腾讯离职了&#xff01; 不知不觉已经在鹅厂打了8年工&#xff0c;如果说在大厂里工作如同在高校…

DAY 12滑动串口最大值【单调队列】 前K个高频元素【优先级队列】

6.滑动窗口最大值 队列的应用&#xff01;&#xff01; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff…

deep image matting

[Matting]论文阅读&#xff1a;Deep Image Matting 详细解读-CSDN博客文章浏览阅读3.5k次&#xff0c;点赞2次&#xff0c;收藏10次。[Matting]论文阅读&#xff1a;Deep Image Matting 详细解读一 、摘要二、方法2.1 第一部分&#xff08;Matting encoder-decoder stage&#…

ThingsBoard社区版入门介绍

介绍 本教程主要演示ThingsBoard的基本用法并掌握: 设备连接&#xff1b;数据发布&#xff1b;数据展示&#xff1b;警报触发&#xff1b;通知推送。 教程将连接和可视化来自温度传感器的数据以及简单使用。 必备条件 你需要启动并运行ThingsBoard服务&#xff0c; 建议使…

java spring 02. AbstractApplicationContext的refresh

spring创建对象的顺序&#xff0c;先创建beanfactory&#xff0c;再会把xml文件读取到spring。 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {//调用父类的构造方法super(p…

05_Mongooes

Mongooes Mongoose是通过Node来操作MongoDB的一个模块。是基于Node.js的第三方模块。 一、Node.js安装 1.解压 2.创建文件夹 解压路径下&#xff0c;创建两个文件夹 node_global&#xff1a;全局安装位置 node_cache&#xff1a;缓存 3.配置 配置环境变量 在path路径…

挂耳式运动蓝牙耳机什么牌子好?六大选购技巧大揭秘

随着蓝牙耳机的普及&#xff0c;越来越多的人选择它们来满足日常的娱乐需求。这些耳机以时尚的设计和舒适的佩戴体验而受到青睐。蓝牙耳机主要分为挂耳式和入耳式两大类。尽管入耳式耳机功能全面&#xff0c;但对于热衷运动的用户来说不够稳固&#xff0c;因为在运动时很容易掉…

蓝桥杯-大小写转换

转换方法 toLowerCase() String类的toLowerCase()方法可以将字符串中的所有字符全部转换成小写&#xff0c;而非字母的字符不受影响&#xff0c;语法格式如下&#xff1a; 字符串名.toLowerCase() //将字符串中的字母全部转成小写&#xff0c;非字母不受影响。 package chap…