006——队列

队列:

一种受限的线性表(线性逻辑结构),只允许在一段进行添加操作,在另一端只允许进行删除操作,中间位置不可操作,入队的一端被称为队尾,出队的一端被称为队头,在而我们会用两个指针分别用于标记队首和队尾,分别叫做队首指针和队尾指针

 单端队列:

存储结构:

顺序队列

顺序存储,基于数组来存储

两种思路

思路1:r指针指向尾元素的下一个位置

Ⅰ)初始空的队列:f=0,r=0

typedef struct {int* data;//数组int f, r;//front队首指针  rear队尾指针 
}Squeue;

Squeue InitQueue()
{Squeue q;q.data = (int*)malloc(sizeof(int) * maxsize);if (q.data == NULL){printf("空间分配失败\n");}else {q.f = q.r = 0;}return q;
}

Ⅱ)入队:a[r]=k;r++;//a[r++]=k;

void Enqueue(Squeue* q, int k)
{q->data[q->r] = k;r++;
}

Ⅲ)出队:f++;

void Dequeue(Squeue* q)
{q->f++;
}

Ⅳ)判满:r==maxsize(假溢出)

Ⅴ)判空:f==r

思路2:r指针指向真正的尾元素

Ⅰ)初始空的队列:f=0,r=-1

Squeue InitQueue()
{Squeue q;q.data = (int*)malloc(sizeof(int) * maxsize);if (q.data == NULL){printf("空间分配失败\n");}else {q.f = 0;q.r = 1;}return q;
}

Ⅱ)入队:r++;a[r]=k;//a[++r]=k;

void Enqueue(Squeue* q, int k)
{r++;q->data[q->r] = k;}

Ⅲ)出队:f++;

void Dequeue(Squeue* q)
{q->f++;
}

Ⅳ)判满:r==maxsize-1(假溢出)

Ⅴ)判空:f==r+1

如何解决假溢出的问题?

形成循环队列-->取余(思路1相对来说更加方便取余)

Ⅰ)初始空的队列:f=0,r=0

Ⅱ)入队:a[r]=k;r=(r+1)%maxsize;

Ⅲ)出队:f=(f+1)%maxsize;

Ⅳ)判满:

        方法①:牺牲一个存储空间(r+1)%maxsize==f;

        方法②:队满之前的操作一定是入队flag==0操作

                       队空之前的操作一定是出队flag==1操作

        则用一个变量flag来记录此时是入队操作还是出队操作

                        f==r&&flag==0

Ⅴ)判空:f==r

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
//循环队列
typedef struct {int* data;//数组int f, r;//front队首指针  rear队尾指针 
}Squeue;
Squeue InitQueue()
{Squeue q;q.data = (int*)malloc(sizeof(int) * maxsize);if (q.data == NULL){printf("空间分配失败\n");}else {q.f = q.r = 0;}return q;
}
void Enqueue(Squeue* q, int k)
{if ((q->r + 1) % maxsize == q->f){printf("队满,不能入队\n");return;}q->data[q->r] = k;q->r = (q->r + 1) % maxsize;}
void Dequeue(Squeue* q)
{if (q->f == q->r){printf("队空,不能出队\n");return;}printf("队首%d出队\n", q->data[q->f]);q->f = (q->f + 1) % maxsize;
}
int main()
{return 0;
}

链式队列

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
//链式队列
typedef struct Qnode {int data;struct Qnode* next;
}QNode;
typedef struct Queue {QNode* f;QNode* r;
}LinkQ;LinkQ InitLinkQ()
{LinkQ q;q.f = (QNode*)malloc(sizeof(QNode));if (q.f == NULL){printf("空间分配失败\n");}else {q.f->next = NULL;q.r = q.f;}return q;
}
LinkQ Enqueue(LinkQ q, int k)
{QNode* s = (QNode*)malloc(sizeof(QNode));if (s == NULL){printf("空间分配失败,不能入队\n");}else {s->data = k;s->next = NULL;q.r->next = s;q.r = s;}return q;}
LinkQ Dequeue(LinkQ q)
{if (q.r == q.f){printf("空间分配失败,不能出队\n");return q;}QNode* p = q.f->next;q.f->next = p->next;if (q.r == p){q.r = q.f;}printf("队首%d出队\n", p->data);free(p);p = NULL;
}
int main()
{return 0;
}

双端队列

双端队列,可以简单理解成将两个队列合在一起,而双端队列的两端分为前端和后端,而在着两端均可以进行出入队操作

存储方式:

顺式存储

前面可以了解到,顺序存储我们是用数组来实现,那这里就会存在一个问题:前端的位置和后端的位置是不固定的,-因为我们不知道前端的位置具体插入多少元素,后端的位置插入多少元素,所以我们采用循环数组来实现存储

这里还有一个需要考虑的问题:到底是先动指针还是先放数据?

①前后端先动指针后放数据

这个时候我们会发现中间会存放一个空数据,所以是不行的

①前后端先放数据后动指针

这个时候我们会发现有的元素数据会被覆盖掉

所以我们需要一端是先移动指针,一段是先放入数据

不过这样的话,其中一个指针指向的是该元素,另一个指针指向的是该元素的下一个位置

代码案例:

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
int* q=NULL;//指针模拟开数组
int l, r;//左端 右端
int size;//记录双端队列中实际的元素个数void InitQueue() {q = (int*)malloc(sizeof(int) * maxsize);if (q == NULL) {printf("空间访问失败\n");return;}size = 0;l = r = 0;
}//左端入队
void insert_left(int k) {if (size == maxsize) {printf("队满,不能入队\n");return;}q[l] = k;l = (l - 1 + maxsize) % maxsize;size++;
}//左端出队
void delete_left() {if (size == 0) {printf("队空,不能出队\n");return;}printf("出队元素为%d", q[(l + 1) % maxsize]);l = (l + 1) % maxsize;size--;
}//右端入队
void insert_right(int k) {if (size == maxsize) {printf("队满,不能入队\n");return;}r = (r + 1 ) % maxsize;q[r] = k;size++;
}//右端出队
void delete_right() {if (size == 0) {printf("队空,不能出队\n");return;}printf("出队元素为%d", q[(r - 1 + maxsize) % maxsize]);r = (r - 1 + maxsize) % maxsize;size--;
}//打印
void show() {int i = (l + 1)%maxsize;while (i != r) {printf("%d\t", q[i]);i = (i + 1) % maxsize;}printf("%d\n", q[r]);}int main() {InitQueue();insert_left(10);insert_left(5);insert_right(13);insert_right(56);show();
}

链式存储

因为双端队列需要往两端去延长,所以如果用链表来实现的话,我们需要用双向链表来去实现。

代码示例

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10 
typedef struct linkQ{int data;struct linkQ* pre;struct linkQ* next;
}Node; 
Node* l=NULL;
Node* r=NULL; 
void initqueue()
{l=(Node*)malloc(sizeof(Node));if(l==NULL){printf("空间分配失败\n");return;}l->next=NULL;l->pre=NULL;r=l;
}
//左边
void insert_left(int k)
{Node* s=(Node*)malloc(sizeof(Node));if(s==NULL){printf("空间分配失败,不能入队\n");return;}l->data=k;s->pre=l->pre;l->pre=s;s->next=l;l=s; } 
void delet_left()
{if(l==r){printf("队空,不能出队\n");return; 	}int x=l->next->data;printf("%d出队\n",x); Node* p=l;l=p->next;l->pre=p->pre;free(p);p=NULL;
}
//右边
void insert_right(int k)
{Node* s=(Node*)malloc(sizeof(Node));if(s==NULL){printf("空间分配失败,不能入队\n");return;}s->data=k;s->next=r->next;s->pre=r;r->next=s;r=s;} void delet_right(){if(l==r){printf("队空,不能出队\n");return; 	}int x=r->data;printf("%d出队\n",x); Node* p=r;r=p->pre;r->next=p->next;free(p);p=NULL;
}
void show()
{Node* p=l->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");
}
int main()
{initqueue();insert_left(1);insert_left(2);insert_left(3);insert_right(4);insert_right(8);printff();delet_left();delet_right(); delet_right();delet_right();show();return 0;
}

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

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

相关文章

iOS 中 KVC 与 KVO 底层原理

KVC 本质&#xff1a; [object setValue: forKey:];即使没有在.h 文件中有property 的属性声明&#xff0c;setValue:forKey依然会按照上图流程执行代码 KVC 如果成功改变了成员变量&#xff0c;是一定可以被 KVO 监听到成员变量的前后改变的 KVO runtime会生成中间类&…

Leetcode 378. 有序矩阵中第 K 小的元素

1.题目基本信息 1.1.题目描述 给你一个 n x n 矩阵 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2…

GPT1-GPT3论文理解

GPT&#xff11;&#xff0d;GPT&#xff13;论文理解 视频参考&#xff1a;https://www.bilibili.com/video/BV1AF411b7xQ/?spm_id_from333.788&vd_sourcecdb0bc0dda1dccea0b8dc91485ef3e74 1 历史 2017.6 Transformer 2018.6 GPT 2018.10 BERT 2019.2 GPT-2 2020…

ER论文阅读-Decoupled Multimodal Distilling for Emotion Recognition

基本介绍&#xff1a;CVPR, 2023, CCF-A 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Li_Decoupled_Multimodal_Distilling_for_Emotion_Recognition_CVPR_2023_paper.pdf Abstract 多模态情感识别&#xff08;MER&#xff09;旨在通过语言、…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

【LeetCode:116. 填充每个节点的下一个右侧节点指针 + BFS(层次遍历)】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

MFC - 常用基础控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解MFC中的基础控件 基础控件 单选按钮 绘图准备: 调整窗口大小&#xff0c;设置 radio button 单选按钮button 按钮 设置单选按钮变量分别为 m_BN1、 m_BN2、m_BN3 void CMFCApplication3Dlg::OnBnC…

【笔记】机器学习算法在异常网络流量监测中的应用

先从一些相对简单的综述类看起&#xff0c;顺便学学怎么写摘要相关工作的&#xff0c;边译边学 机器学习算法在异常网络流量监测中的应用 原文&#xff1a;Detecting Network Anomalies in NetFlow Traffic with Machine Learning Algorithms Authors: Quc Vo, Philippe Ea, Os…

C++入门——类的默认成员函数(构造函数)

文章目录 前言一、构造函数二、栈的构造函数总结 前言 ⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数 默认成员函数很重要&#xff0c;也⽐较复杂&#xff0c;我们要从两个⽅⾯去学习&#xff1a; 第⼀&#xff1a;我们不写时&#xff0c;编译器默认…

Spring后端直接用枚举类接收参数,自定义通用枚举类反序列化器

在使用枚举类做参数时&#xff0c;一般会让前端传数字&#xff0c;后端将数字转为枚举类&#xff0c;当枚举类很多时&#xff0c;很可能不知道这个code该对应哪个枚举类。能不能后端直接使用枚举类接收参数呢&#xff0c;可以&#xff0c;但是受限。 Spring反序列默认使用的是J…

如何用Shell命令结合 正则表达式 统计文本中的ip地址数量

文章目录 简介问题回答 简介 IP 地址&#xff08;Internet Protocol Address&#xff09;是互联网协议地址的简称&#xff0c;是互联网上为联网的设备&#xff08;如计算机、服务器、路由器、手机等&#xff09;分配的唯一标识符。IP 地址的主要功能是实现不同网络设备之间的通…

[Python]一、Python基础编程(2)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. 文件操作 把⼀些内容 ( 数据 )存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒ 。 1.1 文件的基本操作 1. 打开文件 2. 读写操作 3. 关闭…

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息&#xff0c;比如用户手机号码信息。然而随着时间的变化&#xff0c;某些用户信息会发生改…

【软件工程】需求分析概念

一、定义 二、为什么要进行需求分析&#xff1f; 三、需求分析任务 四、与用户沟通获取需求的方法 五、分析建模 六、软件需求规格说明 例题 选择题

【题解】【枚举,数学】——小 Y 拼木棒

【题解】【枚举&#xff0c;数学】——小 Y 拼木棒 小 Y 拼木棒题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示数据规模与约定 1.题意简述2.思路解析3.AC代码 前置知识&#xff1a;排列组合&#xff0c;暴力枚举基础知识。 小 Y 拼木棒 通往洛谷的传送门 …

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会&#xff0c;随着医疗服务需求的不断增长和医疗信息化的快速发展&#xff0c;提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

图像处理基础知识点简记

简单记录一下图像处理的基础知识点 一、取样 1、释义 图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化, 决定了图像的空间分辨率。 2、过程 简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个…

一种求解无人机三维路径规划的高维多目标优化算法,MATLAB代码

在无人机三维路径规划的研究领域&#xff0c;高维多目标优化算法是一个重要的研究方向。这种算法能够同时考虑多个目标&#xff0c;如航迹距离、威胁代价、能耗代价以及多无人机协同性能等&#xff0c;以实现无人机路径的最优规划。 无人机路径规划算法的研究进展表明&#xf…

中国最厉害的改名大师,颜廷利教授的名字来自于国学易经元亨利贞

颜廷利教授&#xff0c;一位源自齐鲁大地山东济南的世界级文化名人&#xff0c;他的名字背后承载着深厚的家族易学传统。在颜廷利教授的童年记忆中&#xff0c;家族长辈常以《易经》中频繁出现的“元、亨、利、贞”四字&#xff0c;寓意四季之变换&#xff0c;将这四个字分别对…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…