queue

文章目录

  • 定义
  • 分类
    • 链式队列
    • 静态队列
      • 循环队列
        • 静态队列为什么必须是循环队列?
        • 循环队列需要几个参数?
        • 循环队列入队伪代码
        • 循环队列出队伪代码
        • 判断循环队列是否为空
        • 判断循环队列是否已满
  • 循环队列的代码实现
  • 队列的应用

定义

一种可以实现“先进先出”的存储结构。并且只允许一端入,另一端为出。而且不能对中间的元素进项进行插入删除。在这里插入图片描述栈是先进后出。且只允许在一端插入与删除,就是入口与出口都是同一个。在这里插入图片描述


分类

链式队列

对链表进行一些操作和限制,就成了队列。
在栈当中,头部尾部的代号是Top和Bottom;队列当中,头部尾部的表达式是front和rear。

静态队列

用数组实现,定义头部与尾部之后,也可以实现队列,即把数组的一些功能砍掉,再增加一点队列的功能。静态队列都必须是循环队列

循环队列

需要搞懂:

  1. 静态队列为什么必须是循环队列?
  2. 循环队列需要几个参数来确定?
  3. 循环队列各个参数的含义。
  4. 循环队列入队的伪代码。
  5. 循环队列出队的伪代码。
  6. 如何判断循环队列是否为空。
  7. 如何判断循环队列是否已满。

如果f指向第一个元素,r指向最后一个的话,不好操作,参考链表,链表的第一个是头结点,里面是没有有效元素的。**则现在定义,front指向第一个有效元素的地址,而rear指向最后一个元素的下一个,**错开来,为了方便对队列进行操作。可以理解为两个指针其中有一个指向必须为空,如果首指针指向了一个有效节点,难么尾指针后移一位指,反之一样。
在这里插入图片描述
**front则是用来删除元素的,删除一个元素就往上移一个。**假如front从下往上删除元素,按照链表的思路来说,删除的元素删了,就有空间空闲出来了,但是静态队列不一样,这是基于数组的,数组删除元素后,空间成空闲空间了,无法填充继续使用,造成空间浪费。

**rear是添加元素的,每添加一个元素就网上移一个。**所以无论是删除还是添加,front与rear都往上移动,不论是入队还是出队,这两个参数都是只增不减。

静态队列为什么必须是循环队列?

上述静态队列当中增增删删,那么就会造成rear端溢出(但是CPP不会检查),而front端浪费,并且只能增不能减,造成空间的大量浪费。所以对于这种情况,可以采用循环队列的形式,即当rear已经指向数组最后一个元素时,**那么就可以转而将rear指向数组的第一个空出来的空间。**这就是使用循环队列。
在这里插入图片描述
例如,这种就是循环队列,队列当中有“中 国”两个字符。

循环队列需要几个参数?

两个参数来确定,在不同场合(以下列举三个场合)有不同的含义。建议初学者先记住,再慢慢体会。

  1. 初始化
    front和rear的值都是0
  2. 队列非空
    front代表的是队列第一个元素
    rear代表的是队列最后一个有效元素
  3. 队列空
    front和rear的值相等,但不一定是0

循环队列入队伪代码

具体步骤:

  1. 将值存入当前rear所处的位置
  2. 之后rear = (rear + 1) % length(数组)
    注意此处的错误写法是直接rear = rear + 1。

循环队列出队伪代码

具体步骤:

  1. front = (front + 1) % length(数组)

判断循环队列是否为空

if (front == rear)

如果front和rear的值相等,那么该队列就是空的。

判断循环队列是否已满

在这里插入图片描述

假如数的排布是这样的,现在front是指向了3号,rear是指向了1号,那么front的下一个元素应该指向哪里?是顺时针还是逆时针?参考以上的公式,front = (front + 1) % length(数组),得出结论是4号元素即为front后面的那个元素。

需要注意的是,front与rear是没有规律的,front可以比rear大,这两个是没有任何规律的。

还有一个就是,当front == rear的时候,怎么判断是空了还是满了。

  1. 使用循环队列的小妙招,假如队列只能放 n n n个元素,现在最多放 n − 1 n-1 n1个,剩下一个就空着,这样就好判断是否为满,是否为空。
  2. 多增加一个标识参数。

以上方法常用方法1。用了方法1就使得上方判断队列为空的表达式正确且唯一了。

综上,如果rear和front紧挨着,则队列已满(空出一位)。

if ((r + 1) % (length(数组长度)) == f)
	return;
else
	return 不满;

循环队列的代码实现

#include <iostream>
#include <cmalloc>

using namespace std;

typedef struct Queue{
	int *pBase;
	int front;
	int rear;
}QUEUE;

void init(QUEUE *);
bool en_queue(QUEUE *, int val);
void traverse(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *, int *);
bool empty_queue(QUEUE *);

int main(){
	QUEUE Q;
	init(&Q);
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);
	
	traverse(&Q);
	out_queue(&Q, &val);
	
	return 0;
} 

//初始化
void init(QUEUE *pQ)
{
	pQ->pBase = (int *)malloc(sizeof(int) * 6);
	pQ->front = 0;
	pQ->rear = 0;
}

//放值
bool en_queue(QUEUE *, int val)
{
	if (full_queue(pQ))
	{
		return false;
	}
	else
	{	pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % (6);
		return true;
	}
}

//判断是否已满
bool full_queue (QUEUE *pQ)
{
	if ((pQ->rear + 1) % 6 == pQ->front)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void traverse(QUEUE *pQ)
{
	int i = pQ->front;
	while (i != pQ->rear)
	{
		cout << pQ->pBase[i] << endl;
		i = (i + 1) % 6;
	}
	return;
}

//出队
bool out_queue(QUEUE *, int *pVal)
{
	if (empty_queue(pQ))
		return false;
	else
	{
		*pVal = pQ->pBase[pQ->front];
		pQ->front = (pQ->front + 1) % 6;
		return true;
	}

}

//判断是否为空
bool empty_queue(QUEUE *pQ)
{
	if (pQ->front == pQ->rear)
		return true;
	else
	{
		return false;
	} 

}

队列的应用

所有和时间有关的操作都与队列有关。

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

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

相关文章

探索Java API学习路线:从基础到高级的全面指南

文章目录 第一阶段&#xff1a;入门基础1. 环境准备2. 学习Java基础 第二阶段&#xff1a;熟悉常用的Java API1. Java标准库2. Java API文档 第三阶段&#xff1a;深入学习特定领域的Java API1. Java GUI API2. Java数据库连接&#xff08;JDBC&#xff09;API3. Java多线程API…

苍穹外卖day08——地址簿+用户下单+订单支付(做不了)

导入地址簿——需求分析与设计 产品原型 接口设计 数据库设计 导入地址簿——代码导入 导入地址簿——功能测试 没有问题 用户下单——需求分析与设计 业务说明 业务流程 接口设计 数据库设计 用户下单——代码开发 DTO设计和VO设计 Controller层中 RequestMapping(&q…

堆喷射的小例子

引自&#xff1a;https://blog.csdn.net/lixiangminghate/article/details/53413863 照着作者的意思&#xff0c;自己的测试代码&#xff1a; #include <iostream> #include <windows.h> #include <stdio.h>class base {char m_buf[8]; public:virtual int…

CAN学习笔记1:计算机网络

计算机网络 1 概述 计算机网络就是把多种形式的计算机用通信线路连接起来&#xff0c;并使其能够互相进行交换的系统。实际上&#xff0c;计算机网络包括了计算机、各种硬件、各种软件、组成网络的体系结构、网络传输介质和网络通信计数。因此&#xff0c;计算机网络是计算机…

阿里Java开发手册~集合处理

1. 【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 1 &#xff09; 只要重写 equals &#xff0c;就必须重写 hashCode 。 2 &#xff09; 因为 Set 存储的是不重复的对象&#xff0c;依据 hashCode 和 equals 进行判断&#xff…

【计算机网络】简易TCP网络小程序

文章目录 1. 简易TCP网络程序1.1 服务端1.1.1 服务端创建套接字1.1.2 服务端绑定1.1.3 服务端监听1.1.4 服务端获取连接1.1.5 服务端处理请求 1.2 客户端1.2.1 客户端创建套接字1.2.2 客户端连接服务器1.2.3 客户端发起请求 1.3 服务器测试1.4 单执行流服务器的弊端 2. 多进程版…

TCP KeepAlive与HTTP Keep-Alive

TCP KeepAlive与HTTP Keep-Alive TCP KeepAliveHTTP Keep-AliveTCP服务器怎么检测客户端断开连接 TCP KeepAlive TCP连接建立之后&#xff0c;如果应用程序或者上层协议一直不发送数据&#xff0c;或者隔很长时间才发送一次数据&#xff0c;那么TCP需要判断是应用程序掉线了还…

【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新

人工智能&#xff08;AI&#xff09;是引领新一轮科技革命和产业变革的重要驱动力。因此&#xff0c;深圳出台相关行动方案&#xff0c;统筹设立规模1,000亿元的人工智能基金群&#xff0c;引导产业集聚培育企业梯队&#xff0c;积极打造国家新一代人工智能创新发展试验区和国家…

15 文本编辑器vim

15.1 建立文件命令 如果file.txt就是修改这个文件&#xff0c;如果不存在就是新建一个文件。 vim file.txt 使用vim建完文件后&#xff0c;会自动进入文件中。 15.2 切换模式 底部要是显示插入&#xff0c;是编辑模式&#xff1b; 按esc&#xff0c;底部要是空白的&#xff0…

提高业务效率:利用手机号在网状态 API 进行智能筛选

引言 随着科技的不断发展&#xff0c;手机已成为现代人生活中不可或缺的工具。人们通过手机完成通信、娱乐、购物等各种活动&#xff0c;使得手机号成为了一个重要的个人标识。对于企业而言&#xff0c;了解手机号的在网状态对于业务发展和客户管理至关重要。为了提高业务效率…

【Terraform学习】Terraform配置变量(Terraform配置语言学习)

配置变量 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中&#xff0c;单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分&#xff0c;为角色选择可信实体类型&#xff1a; AWS 服务 使用案例:EC2 单击下一步 添加权限&#xff1a;现在&#xff0c…

细讲TCP三次握手四次挥手(一)

计算机网络体系结构 在计算机网络的基本概念中&#xff0c;分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多&#xff0c;在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必…

【数学】差分数组(一维差分)

一.简介 差分数组是指对一个一维数组进行差分操作得到的新数组。差分操作是指计算原数组中相邻元素之间的差异&#xff0c;并将这些差异作为新数组的元素。 具体而言&#xff0c;对于一个长度为n的一维数组x&#xff0c;其差分数组diff的第i个元素可以通过以下公式计算得到&am…

linux NDK交叉编译rtmp 与 ffmpeg+rtmp交叉编译(v7a,v8a) 完成流程

最近在学RTMP,记录一下完成的编译流程 我是mac 电脑,但是mac上编译一直通过不了,后来才换到服务器上编译, 其实mac也能编译,只是最开始踩到坑里面了… 这里记录一下linux编译完整流程 环境: NDK: android-ndk-r17cFfmpeg: ffmpeg4.2.2 (高版本也可以编译)system: mac 1. …

云原生架构

1. 何为云原生&#xff1f; 很多IT业内小伙伴会经常听到这个名词&#xff0c;那么什么是云原生呢&#xff1f;云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。 当今时代&#xff0c;众多企业希望构建高度可扩展、灵活且有弹性的应用程序&#xff0c;以便能够快…

数据链路层是如何传递数据的

数据链路层是如何传递数据的 数据链路层功能概述封装成帧透明传输差错控制 数据链路层功能概述 数据链路层的主要作用就是加强物理层传输原始比特流的功能。其负责将物理层提供的可能出错的物理连接&#xff0c;改造成逻辑上无差错的数据链路。 数据链路层包括三个基本问题&a…

Matlab的SimuLink对FS32K144编程--SPI通讯控制12bitDAC输出

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 1、硬件介绍&#xff0c;DAC芯片&#xff1a;AD5328BRUZ DAC_SPI_SCK----PTD0(SPI1) DAC_SPI_DIN----PTE0(SPI1)单片…

【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[BSidesCF 2020]Had a bad day1

进入环境&#xff0c;一上来就是一段激励的话&#xff0c;没有啥特别的&#xff0c;源码中也没有看见啥有用的提示 但主要是有&#xff0c;参数的传递&#xff0c;加上前面的index.php&#xff0c;想到了PHP伪协议&#xff0c;或许我们可以直接查看一下隐藏源码 报错了&#xf…

【Linux进程】进程控制(下) {进程程序替换:程序替换的工作原理,程序替换函数exec*,简单的命令行解释器}

四、进程程序替换 之前用fork创建子进程后&#xff0c;父子进程执行同一个程序的不同代码段。 如何使子进程执行另一个不同的程序呢&#xff1f;子进程需要进行程序替换&#xff01; 程序替换&#xff0c;就是通过特定的接口&#xff0c;将磁盘上一个全新的程序&#xff08;包…