队列的详细操作

news2024/9/21 17:57:42

1.循环队列--队列的顺序表示和实现

#include<stdio.h>
#define MAXQSIZE 100
typedef struct {
	int* base;
	int front;
	int rear;
}SqQueue;

int InitQueue(SqQueue& Q)
{
	Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXSIZE的数组空间
	if (!Q.base)
		return -1;
	Q.front = Q.rear = 0;
	return 1;
}

int QueueLength(SqQueue Q)
{
	return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

void insertQueue(SqQueue& Q,int e)
{
	if ((Q.rear + 1) % MAXQSIZE == Q.front)//队满条件,尾指针在循环意义上加一等于头指针,表示队满
		return;
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXQSIZE;
	return;
}

int getTopQueue(SqQueue Q)//去队头元素
{
	if (Q.front != Q.rear)
		return Q.base[Q.front];
}
int DeQueue(SqQueue& Q)//出队(操作是将队头元素删除),队是先进先出
{
	if (Q.front == Q.rear)//队空
		return -1;
	int e = Q.base[Q.front];//保持队头元素
	Q.front = (Q.front + 1) % MAXQSIZE;//头指针加一
	return 1;
}

void print(SqQueue Q) {
	for (int i = Q.front; i != Q.rear; i++)
	{
		printf("%d ", Q.base[i]);
	}
	//printf("(rear)\n");
}
int main()
{
	SqQueue Q;
	InitQueue(Q);
	print(Q);
	int len=QueueLength(Q);
	printf("队列长为:%d\n",len);
	print(Q);
	printf("\n");

	printf("队元素:");
	insertQueue(Q,10);
	insertQueue(Q,20);
	insertQueue(Q,50);
	print(Q);
	printf("\n");

	int newlen = QueueLength(Q);
	printf("新队列长为:%d\n",newlen);
	int topnum=getTopQueue(Q);
	printf("新队头元素为:%d\n",topnum);

	DeQueue(Q);
	int newlen2 = QueueLength(Q);
	printf("出队后的新队列长为:%d\n", newlen2);
	int topnum2 = getTopQueue(Q);
	printf("出队后的新队列队头元素为%d\n", topnum2);
	print(Q);
	return 0;
}

1.1分析(理解/思路):

初始化创建空队列时,令font=rear=0,每当插人新的队列尾元素时,尾指针rear 增1;每当删除队列头元素时,头指针 font减1。因此,在非空队列中,头指针始终指向队列头元素而尾指针始终指向队列尾元素的下一个位置。

1.2:假溢出

假设当前队列分配的最大空间为6,则当队列处于上图(d)所示的状态时不可再继续插入新的队尾元素,否则会出现溢出现象,即因数组越界而导致程序的非法操作错误。事实上,此时队列的实际可用空间并未占满,所以这种现象称为“假溢出”。这是由“队尾入队,队头出队”这种受限制的操作造成的。

1.3:假溢出问题:

怎样解决这种“假溢出”问题呢?一个较巧妙的办法是将顺序队列变为一个环状的空间,如下图 所示,称之为循环队列。

头、尾指针以及队列元素之间的关系不变,只是在循环队列中,头、尾指针“依环状增1”的操作可用“模”运算来实现。通过取模,头指针和尾指针就可以在顺序表空间内以头尾衔接的方式“循环”移动。

队头元素是J5,在元素J6人队之前,在Q.rear 的值为5,当元素J6人队之后,通过“模”运算,Q.rear=(Q.rear +1)%6,得到 Q.rear 的值为 0,而不会出现上图 (d)的“假溢出”状态。

1.4:队空队满如何判断:

  在第二个图中,J7、J8、J9、J10相继入队,则队列空间均被占满,此时头、尾指针相同。在第三个图中,若J5和J6相继从第一个图所示的队列中出队,使队列此时呈“空”的状态,头、尾指针的值也是相同的。
  由此可见,对于循环队列不能以头、尾指针的值是否相同来判别队列空间是“满”还是“空”。
在这种情况下,如何区别队满还是队空呢?
通常有以下两种处理方法。
(1)少用一个元素空间,即队列空间大小为m时,有m-1个元素就认为是队满。这样判断队空的条件不变,即当头、尾指针的值相同时,则认为队空; 而当尾指针在循环意义上加1后是等于头指针则认为队满。因此,在循环队列中队空和队满的条件是:

队空条件:

Q.front == Q.rear;

队满条件:

(Qrear+1)%MAXOSIZE==Q.font;

1.5:初始化:

循环队列的初始化操作就是动态分配一个预定义大小为MAXQSIZE的数组空间

base指向数组空间的首地址。

1.6:注意事项

出队和入队都要先判断队列是否为空!!!

2.链队--队列的顺序表示和实现

#include<stdio.h>
typedef struct QNode {
	int data;
	struct QNode* next;
}QNode,*QueuePtr;
typedef struct {
	QueuePtr front;//队头指针
	QueuePtr rear;//对尾指针
}LinkQueue;

void InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = new QNode;
	Q.front->next = NULL;//头节点的指针域置空
	return;
}

int EnQueue(LinkQueue& Q,int num)//入队
{
	QueuePtr p;
	p = new QNode;
	p->data = num;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	return 1;
}
int DeQueue(LinkQueue& Q, int &e)//出队
{
	if (Q.front == Q.rear)
		return -1;
	QueuePtr p;
	p = Q.front->next;//p指向队头元素
	e = p->data;//e保持队头元素的地址
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;//最后一个元素被删,队尾指针指向头节点(链队出队需要注意的)
	//如果对尾指针也没了,因此需要队尾指针重新赋值(指向头节点)
	delete p;
	return e;
}

int GetHead(LinkQueue Q)
{
	if (Q.front != Q.rear) {
		return Q.front->next->data;
	}
	return -1;
}

int DeleteQueue(LinkQueue& Q, int val)//删除特定值
{
	QueuePtr p = Q.front;
	while (p->next!=NULL&&p->next->data!=val)
	{
		p = p->next;
	}
	if (p->next == NULL) {
		return -1;
	}

	QueuePtr temp = p->next;
	p->next = temp->next;
	if (temp == Q.rear)
	{
		Q.rear = p;
	}
	delete temp;
	return 1;
}
void ShowQueue(LinkQueue Q) {
	QueuePtr p = Q.front->next;
	while (p!=NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
int main()
{

	LinkQueue Q;
	InitQueue(Q);
	EnQueue(Q, 10);
	EnQueue(Q, 20);
	EnQueue(Q, 30);
	EnQueue(Q, 40);
	EnQueue(Q, 70);
	EnQueue(Q, 60);

	printf("初始链队中元素为:");
	ShowQueue(Q);

	printf("队头元素:%d\n", GetHead(Q));
	int e;
	printf("出队元素: %d ", DeQueue(Q, e));

	printf("\n");
	int head = GetHead(Q);
	if (head != -1) {
		printf("队头元素: %d\n", head); 
		ShowQueue(Q);
	}
	else {
		printf("Queue is empty\n");
	}

	printf("删除队中值为30的节点后队中元素为:");
	DeleteQueue(Q, 30);
	ShowQueue(Q);
	
}

2.1分析(理解/思路):

链队是指采用链式存储结构实现的队列。通常链队用单链表来表示,如图 3.15 所示。一个链队显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。这里和线性表的单链表一样,为了操作方便起见,给链队添加一个头结点并令头指针始终指向头结点

2.2:顺序和链式的入队和出队区别(!!!):

入队:链队在入队前不需要判断队列是否是满的,因为是动态分配空间;

出队:链队在入队前需要判断链队是否为空。但是不同的是链队在出队后需要释放出队元素的所占空间;

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

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

相关文章

QXml 使用方法

VS2019 QT 编译工具链问题解决 使用winqtdeploy.exe 打包环境就可以正常运行&#xff0c;缺少某一个运行库引起的 简易使用python脚本编译运行 Python3 中的 slots 和 QT 中的 slots 宏定义重复, 放在不同的文件中进行调用可以避免 还是比较习惯从源码包引入&#xff08;方便定…

OpenAI新“草莓”模型即将发布,推理模式引发关注

OpenAI发布“草莓”模型的消息引发广泛关注。这个新模型将在未来两周内亮相&#xff0c;将为ChatGPT等产品带来全新的技术支持。草莓模型的推理模式具有独特性&#xff0c;能够仿效人类思维&#xff0c;在生成响应之前进行拟人化思考。其推理过程通常需要10到20秒&#xff0c;这…

2_foc闭环调试_ADC电流采样与滤波及pid数据结构

1、ADC电流采样 上次添加了编码器获取电角度的程序&#xff0c;将之前开环控制的角度进行了替换&#xff0c;这次再将电流采样添加进来&#xff0c;之后就可以利用这样一个有反馈的系统进行电流环PI控制器参数调试。 之前写过ADC&#xff0b;DMA电流采样的stm32库函数程序&…

《 C++ 修炼全景指南:八 》智能指针大揭秘:从 auto_ptr 到 unique_ptr shared_ptr 的进化之路

1、引言 在 C 编程中&#xff0c;内存管理历来是复杂且容易出错的部分。手动管理动态分配的内存不仅会导致内存泄漏&#xff0c;还会引发悬空指针和双重释放等问题。如何有效地管理动态内存&#xff0c;避免内存泄漏和未定义行为&#xff0c;往往是困扰初学者和资深开发者的难…

常见 HTTP 状态码详解与Nginx 文件上传大小限制

在我们日常使用 Nginx 搭建网站或应用服务时&#xff0c;可能会遇到很多与文件上传和请求响应相关的问题。今天我们就来聊聊 如何限制文件上传的大小&#xff0c;并介绍一些常见的 HTTP 状态码 及其在 Nginx 中的处理方式。 一、文件上传大小限制 有时&#xff0c;我们需要限…

Web3的崛起与智能合约的角色

随着Web3的发展&#xff0c;去中心化网络逐渐取代了以往的集中控制互联网模式。这一转变不仅强调了用户的自治权和隐私保护&#xff0c;还引入了智能合约这一核心技术。智能合约基于区块链技术&#xff0c;能够自动执行合约条款&#xff0c;无需中介干预&#xff0c;从而确保了…

git下载安装windows

https://git-scm.com/download/win 接下来傻瓜式安装就可以了

Django创建模型

1、根据创建好应用模块 python manage.py startapp tests 2、在models文件里创建模型 from django.db import modelsfrom book.models import User# Create your models here. class Tests(models.Model):STATUS_CHOICES ((0, 启用),(1, 停用),# 更多状态...)add_time mode…

RAR压缩包原密码过于简单如何修改密码?

RAR压缩包作为一种常见的文件压缩格式&#xff0c;广泛应用于文件传输和存储中。为了保障文件的安全性&#xff0c;用户经常会给RAR压缩包设置密码。但有时我们觉得原密码过于简单&#xff0c;想要修改成一个比较复杂的密码&#xff0c;这时我们要如何修改让人压缩包密码呢&…

<<编码>> 第 5 章 绕过拐弯的通信(Seeing Around Corners) 示例电路

灯泡通讯电路 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch05-01-communication-circuit.txt 双边灯泡通讯电路 info::操作说明 鼠…

Windows一键安装Mysql数据库|非官方复杂安装,解压即可,操作简单

我们都知道在官方安装mysql数据库极其复杂&#xff0c;还极大概率遇到各种问题&#xff0c;今天教大家只要解压就可安装完数据库&#xff0c;操作及其简单绿色。 版本包括了mysql8或mysql5&#xff0c;各位各取所需即可。 不管你之前是否安装过数据库&#xff0c;只要端口330…

Ai+若依(智能售货机运营管理系统---帝可得)--货道关联商品【08篇---0004:关联商品】

货道关联商品 需求 对智能售货机内部的货道进行商品摆放的管理 此功能涉及四个后端接口 查询设备类型&#xff08;已完成&#xff09; 查询货道列表&#xff08;待完成&#xff09; 查询商品列表&#xff08;已完成&#xff09; 货道关联商品&#xff08;待完成&#xff0…

个人学习笔记5-2:动手学深度学习pytorch版-李沐

#深度学习# #人工智能# #神经网络# 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09; 6.4 多输入多输出通道 6.4.1 多输入通道 当输入包含多个通道时&#xff0c;需要构造一个与输入数据具有相同输入通道数的卷积核&#xff0c;以便与输入…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 07 如何修改 npm run serve 的启动端口号

如何修改 npm run serve 的启动端口号 首先&#xff0c;找到 npm run serve 对应的脚本 在 package.json 文件中找到 serve 对用的脚本 然后&#xff0c;添加 – port 新端口号 这里修改启动端口号为 9000&#xff0c;则在启动命令后面加上 --port 9000 最后&#xff0c;启动…

【信息论基础第二讲】离散信源的数学模型及其信息测度包括信源的分类、信源的数学模型、离散信源的信息测度、二元信源的条件熵联合熵

一、信源的分类 二、信源的数学模型 1、信源的概念 在通信系统中&#xff0c;收信者在未收到信息以前&#xff0c;对信源发出什么消息是不确定的、随机的、因此我们可以用随机变量、随机序列或者随机过程来描述信源的输出。严格地说&#xff0c;用概率空间来描述信源输出。 …

基于高通主板的ARM架构服务器

一、ARM架构服务器的崛起 &#xff08;一&#xff09;市场需求推动 消费市场寒冬&#xff0c;全球消费电子需求下行&#xff0c;服务器成半导体核心动力之一。Arm 加速布局服务器领域&#xff0c;如 9 月推出 Neoverse V2。长久以来&#xff0c;x86 架构主导服务器市场&#…

百度视频排名代发(百度视频秒收录代发)

百度视频排名代发(百度视频秒收录代发) 代做灰色关键词百度排名&#xff08;代发百度灰色词外推&#xff09;#百度推广#关键词排名#灰色词排名 推荐阅读&#xff1a; 百家号图文排名代发&#xff1a;文章客服系统挂载电话https://www.bsw80.com/post/471.html 很多老板表示想…

CMS之Wordpress建设

下载 https://cn.wordpress.org/ 宝塔安装Wordpress 创建网站 上传文件、并解压、剪切文件到项目根目录 安装 -> 数据库信息 -> 标题信息 http://wordpress.xxxxx.com 登录 http://wordpress.xxxxxxxxx.com/wp-admin/ 1. 主题(模板) wordpress-基本使用-02-在主题…

【Python】由二维列表初始化导致修改元素时会修改相同位置元素的引用问题f = [[0] * len(matrix[0])] * len(matrix)

背景&#xff1a; 在刷Leetcode过程中&#xff0c;需要初始化一个与另一个矩阵&#xff08;如 matrix&#xff09;尺寸相同的二维列表&#xff08;如 f&#xff09;&#xff0c;并填充初始值&#xff08;如 0&#xff09;。一开始用的是这种方法试图创建一个所有元素均为 0 的…

分布式调度方案:Elastic-Job

文章目录 一、什么是分布式调度二、Elastic-Job 介绍三、Elastic-Job 实战3.1 环境搭建3.1.1 本地部署3.1.2 服务器部署3.1.3 Zookeeper 管控台界面 3.2 入门案例3.3 SpringBoot 集成 Elastic-Job3.4 任务分片&#xff08;★&#xff09;3.5 Dataflow 类型调度任务 一、什么是分…