【数据结构】队列 循环队列 双端队列——顺序队列+链式队列完整代码(创建、入队、出队)

2.队列

2.1 队列的定义

  • 定义

    只允许在一端进行插入,另一端删除的线性表。

    • 特征:先进先出(First In First Out->FIFO)

    • 重要术语:队头、队尾、空队列

2.2 队列的顺序存储

2.2.1 初始化
  • 结构体
typedef struct{
    ElemType data[MaxSize]; //静态数组存放队列元素
    int front; //队头指针
    int rear; //队尾指针
}SqQueue;
  • 初始化

    void InitQueue(SqQueue &Q){
        Q.rear=Q.front=0;
    }
    
  • 判空

    bool QueueEmpty(SqQueue &Q){
        if(Q.rear==Q.front)
            return true;
        else
            return false;
    }
    
2.2.2 循环队列
  • 假溢出问题

    当rear走到队尾,队头出栈后仍然有存储空间。

    所以,根据rear==MaxSize判溢出会导致存储空间的浪费。

  • 用循环队列解决假溢出问题:

    把队列看成一个环,rear走到最后一个存储空间时,会重新回到第一个存储空间重新判断。

    • 用取模运算实现环。

  • 队满实现

    • 注:不能以rear==front来判断队满,因为已经用rear==front这个条件判断空队列,所以判满必须牺牲一个存储单元。
  • 另外一些操作

    • 队首指针进1:Q.front=(Q.front+1)%MaxSize
    • 队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
    • 队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
  • 若要求不能浪费那一块存储空间:

    • 方法一:设置size变量记录队中的元素个数:

      typedef struct{
          ElemType data[MaxSize]; 
          int front,rear; 
          int size; //队列当前长度
      }SqQueue;
      
      //初始化时
      rear=front=0;
      size=0;
      
      //队满条件
      size=MaxSize;
      
      //队空条件
      size=0;
      
    • 方法二:设置tag记录最新一次的操作是删除还是插入

      typedef struct{
          ElemType data[MaxSize]; 
          int front,rear; 
          int tag; //最近进行的是删除/插入操作
      }SqQueue;
      //tag的定义:
      //插入操作成功时:tag=1;
      //删除操作成功时:tag=0。
      //只有删除操作,才可能导致队空
      //只有插入操作,才可能导致队满
      
      //初始化
      rear=front=0;
      tag=0;
      
      //队空条件
      front==rear&&tag==0
      
      //队满条件
      front==rear&&tag==1
      
2.2.3 入队
bool EnQueue(SqQueue &Q,ElemType x){
    if((Q.rear+1)%MaxSize==Q.front)return false; //队列已满
    
    Q.data[Q.rear]=x; //新元素插入
    Q.rear=(Q.rear+1)%MaxSize; //队尾加一取模
    return true;
}
2.2.4 出队
bool DeQueue(SqQueue &Q,ElemType &x){
    if(Q.rear==Q.front)return false; //队空报错
    
    x=Q.data[Q.front]; //返回出队元素
    Q.front=(Q.front+1)%MaxSize; //队头指针后移
    return true;
}
2.2.5 获取队头元素
bool GetHead(SqQueue Q,ElemType &x){
    if(Q.rear==Q.front)return false;
    
    x=Q.data[Q.front];
    return true;
}
*完整代码 顺序队列
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#define ElemType int
#define MaxSize 5

typedef struct {
	ElemType data[MaxSize];
	int front, rear;
}SqQueue;

void InitQueue(SqQueue& Q) {
	Q.front = Q.rear = 0;
}

bool QueueEmpty(SqQueue& Q) {
	if (Q.rear == Q.front)
		return true;
	else
		return false;
}

int Length(SqQueue& Q) {
	return (Q.rear + MaxSize - Q.front) % MaxSize;
}

bool EnQueue(SqQueue& Q, ElemType x) {
	if ((Q.rear + 1) % MaxSize == Q.front)return false;

	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	return true;
}

bool DeQueue(SqQueue& Q,ElemType &x) {
	if (Q.rear == Q.front)return false;

	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	return true;
}

bool GetHead(SqQueue Q, ElemType& x) {
	if (Q.rear == Q.front)return false;

	x = Q.data[Q.front];
	return true;
}

//从队头开始打印
void PrintQ(SqQueue Q) {
	int p = Q.front;
	while (p!=Q.rear) {
		printf("%d ", Q.data[p]);
		p = (p +1) % MaxSize;
	}
	printf("\n\n");
}

int main(){
	SqQueue Q;
	InitQueue(Q);

	printf("入栈:\n");
	EnQueue(Q, 1);
	EnQueue(Q, 2);
	EnQueue(Q, 3);
	EnQueue(Q, 4);
	PrintQ(Q);
	printf("队列长度:%d\n", Length(Q));

	printf("出栈:\n");
	int x;
	DeQueue(Q, x);
	printf("出栈元素为:%d\n", x);
	DeQueue(Q, x);
	printf("出栈元素为:%d\n", x);
	PrintQ(Q);

	GetHead(Q, x);
	printf("栈顶元素:%d\n", x);

	printf("循环队列测试:\n");
	EnQueue(Q, 5);
	EnQueue(Q, 6);
	EnQueue(Q, 7);
	PrintQ(Q);
	DeQueue(Q, x);
	PrintQ(Q);
}

2.3 队列的链式存储

  • 就是一个有队头指针和队尾指针的单链表。

//链式队列结点
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;
//链式队列
typedef struct{
    LinkNode *front,*rear;
}LinkQueue;
*完整代码 链队
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

#define ElemType int

typedef struct LinkNode{
	ElemType data;
	struct LinkNode* next;
}LinkNode;

typedef struct {
	LinkNode* front, * rear;
}LinkQueue;

void InitQueue(LinkQueue& Q) {
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next = Q.rear->next = NULL;
}

bool isEmpty(LinkQueue& Q) {
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}

void EnQueue(LinkQueue& Q, ElemType x) {
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	p->data = x;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
}

bool DeQueue(LinkQueue& Q, ElemType& x) {
	if (Q.front == Q.rear)return false; //空栈

	LinkNode* p = Q.front->next;
	x = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)Q.rear = Q.front; //若原队列中只有一个结点,则删除后变空
	free(p);
	return true;
}

void PrintQ(LinkQueue& Q) {
	LinkNode* p = Q.front->next;
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n\n");
}

int main() {
	LinkQueue Q;
	InitQueue(Q);

	printf("入栈:\n");
	EnQueue(Q, 1);
	EnQueue(Q, 2);
	EnQueue(Q, 3);
	EnQueue(Q, 4);
	PrintQ(Q);

	printf("出栈:\n");
	int x;
	DeQueue(Q, x);
	printf("出栈元素为:%d\n", x);
	DeQueue(Q, x);
	printf("出栈元素为:%d\n", x);
	PrintQ(Q);
}

在这里插入图片描述

2.4 双端队列

  • 定义

    也是插入和删除受限的线性表:

    • 还有输入受限或输出受限的双端队列:

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

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

相关文章

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

蓝牙系列三:BLE协议栈各层数据格式解析

继续蓝牙的学习,本篇还是根据韦东山老师的视频理解以及整理。 对于BLE系统,它分为上下两块。上面那一块,我们称为host主机。下面这一块是controller,你可以简单的认为它就是一个蓝牙芯片。如下图所示(Host + Controller,他们的接口是HCI) 对于host这一块,它运行于linu…

YOLOv8-Openvino-ByteTrack【CPU】

纯检测如下&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 注&#xff1a;YOLOv8和YOLOv9代码内容基本一致&#xff01; 全部代码Github&…

OJ_链表合并

题干 C实现 #include <stdio.h> #include <list>using namespace std;int main() {int s1, s2, val;scanf("%d", &s1);list<int> ls1, ls2;for (int i 0; i < s1; i) {scanf("%d", &val);ls1.push_back(val);}scanf("…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

GIS之深度学习06:CUDA12安装(适配版)

CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的并行计算平台和编程模型&#xff0c;用于利用NVIDIA GPU的并行计算能力&#xff0c;它允许开发者使用类似于C语言的编程语言编写并行程序&#xff0c;利用GPU的大规模并行计算能力加速各种类型的…

3D行业趋势2024

3D 行业似乎总是想出新的方法来加快自身的变革速度&#xff0c;并一路上给我们带来惊喜。 2024 年&#xff0c;3D 景观将会发生前所未有的变化&#xff0c;但仍有一些线索可以帮助我们指明正确的方向。 话虽如此&#xff0c;以下是 3D 工程行业正在着手、扩大或可能在来年深入参…

矩阵爆破逆向-条件断点的妙用

不知道你是否使用过IDA的条件断点呢&#xff1f;在IDA进阶使用中&#xff0c;它的很多功能都有大作用&#xff0c;比如&#xff1a;ida-trace来跟踪调用流程。同时IDA的断点功能也十分强大&#xff0c;配合IDA-python的输出语句能够大杀特杀&#xff01; 那么本文就介绍一下这个…

Kaggle竞赛入门级---泰坦尼克号飞船(0.80)

由于数据集需要翻墙&#xff0c;先附上数据集 链接&#xff1a;https://pan.baidu.com/s/10MTlK_3kXMRw6JsSTT8tVg?pwd6666 提取码&#xff1a;6666 注意正文会讲述我的步骤处理思路&#xff08;代码可能并不会完整的放在正文中&#xff08;这过于繁琐了&#xff09;&#…

ArmSoM Rockchip系列产品 通用教程 之 HDMI-IN使用

1. HDMI-IN简介 HDMI IN功能可以通过桥接芯⽚的⽅式实现&#xff0c;将HDMI信号转换成MIPI信号接收RK3588芯⽚平台⾃带HDMI RX模块&#xff0c;可以直接接收HDMI信号&#xff0c;无需通过桥接芯⽚实现。在ArmSoM系列产品中&#xff0c;ArmSoM-W3支持HDMI-IN功能HDMI-IN功能框图…

华大基因护航沙特“2030愿景”实现,将“中国技术”带到中东市场

沙特“2030愿景”提出&#xff0c;要将国民平均寿命从74岁提高到80岁。沙特人民日益增长的医疗健康需求亟待更加全面、高效的医疗卫生体系。2023年&#xff0c;在沙特首都利雅得&#xff0c;由华大基因沙特全资子公司与当地合作方共同成立的综合精准医学检验实验室Genalive开业…

基于单片机的数字温度计设计

目 录 摘 要 I Abstract II 引 言 1 1 整体方案设计 3 1.1 主控芯片类型选择 3 1.2 测温电路选择 3 1.3 系统总体方案 4 2 系统的硬件电路设计 5 2.1 单片机系统设计 5 2.2 显示模块设计 8 2.3 温度读取电路的设计 10 3 系统软件设计 13 3.1 软件开发环境的介绍 13 3.2 系统重…

图像分类技术在城市垃圾分类与处理中的应用与实践

一、引言 在当今世界&#xff0c;城市化进程不断加快&#xff0c;随之而来的是日益增长的垃圾处理压力。城市生活垃圾、工业固体废物和危险废物的处理已经成为环境保护领域的一大挑战。为了应对这一挑战&#xff0c;卫生填埋、垃圾堆肥和垃圾焚烧等技术路线应运而生。其中&…

(文末送书)直击前沿技术:《低代码平台开发实践:基于React》

目录 前言 一、React与低代码平台的结合优势 二、基于React的低代码平台开发挑战 三、基于React的低代码平台开发实践 四、书籍推荐 《低代码平台开发实践&#xff1a;基于React》 1、图书介绍 2、适用人群 3、 作者简介 4、写书原由 5、解决问题 6、书…

2024年冲刺年薪40w,java面试常问知识点

前言 刚刚过去的双十一&#xff0c;让“高性能”“高可用”“亿级”这3个词变成了技术热点词汇&#xff0c;也让很多人再次萌发成为「架构师」的想法。先问大家一个问题&#xff1a;你觉得把代码熟练、完成需求加上点勤奋&#xff0c;就能成为架构师么&#xff1f;如果你这么认…

数据结构详解①——诸论

目录 前言 引入&#xff1a; 基本概念和术语 数据 数据元素 数据项 数据对象 数据结构 逻辑结构 物理结构 数据类型 为什么要设计出来数据类型呢&#xff1f; 数据类型的分类 抽象数据类型 数据结构与算法的关系 算法 定义 特性 设计要求 效率度量方法 事…

nodejs版本管理工具nvm安装和环境变量配置

1、下载nvm.exe https://github.com/coreybutler/nvm-windows/releases2、安装 1.在D盘根目录新建一个dev文件夹&#xff0c;在dev里面再新建一个nodejs。 2.双击下载好的nvm.exe 修改文件路径&#xff0c;且路径中不能有中文 3.安装完成后在D:\dev\nvm打开settings.txt&…

网络信息安全:11个常见漏洞类型汇总

一、SQL注入漏洞 SQL注入攻击&#xff08;SQL Injection&#xff09;&#xff0c;简称注入攻击、SQL注入&#xff0c;被广泛用于非法获取网站控制权&#xff0c;是发生在应用程序的数据库层上的安全漏洞。 在设计程序&#xff0c;忽略了对输入字符串中夹带的SQL指令的检查&…

C语言写学生信息管理系统

说明:本博文来自CSDN-问答板块,题主提问。 需要:用C语言设计一个学生信息管理系统(尽量不使用指针),学生信息包括学号,姓名,数学成绩,C语言成绩,英语成绩和每个学生的总成绩这几项。系统要实现如下几个功能:1.添加学生2.删除学生3.修改学生信息4.查询学生信息5进行学…

阿里云服务器ECS u1实例性能怎么样?有用过的吗?

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…