【图文并茂】c++介绍之队列

1.1队列的定义

队列(queue)简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作

一些基础概念:

  • 队尾(rear) :进行插入的一端
  • 队首(front):进行删除的一端
  • 入队(enqueue):插入新元素
  • 出队(dequeue):删除新元素

队列是一种先进先出表(FIFO),而前面介绍过的栈是一种先进后出表。

(一个队列)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


1.2队列抽象数据类型

如图:

在这里插入图片描述


1.3队列的顺序存储结构及其基本运算

队列中数据元素的逻辑结构呈线性关系,所以队列可以像线性表一样采用顺序存储结构进行存储,即分配一块连续的存储空间来存放队列的元素,并用两个指针来反映队列中元素变化

顺序队:采用顺序存储结构的队列

(1)声明

typedef int ElemType;
#define MaxSiaze 50
typedef struct
{ElemType data[MaxSiaze];int front, rear;	//队头与队尾指针
}SqQueue;

图示:

在这里插入图片描述
Pe-1694079903125)

(2)初始化队列

//初始化队列
void InitQueue(SqQueue*& q)
{q = (SqQueue*)malloc(sizeof(SqQueue));q->front = q->rear = -1;
}

(3)销毁队列

//销毁队列
void DestroyQueue(SqQueue*& q)
{free(q);
}

(4)判断队列是否为空

//判断队列是否为空
bool QueueEmpty(SqQueue*&q)
{return(q->front == q->rear);
}

(5)入队

bool enQueue(SqQueue*& q, ElemType e)
{if (q->rear == MaxSiaze - 1)	//队满上溢出return false;q->rear++;q->data[q->rear] = e;return true;
}

(6)出队

bool deQueue(SqQueue*& q, ElemType& e)
{if (q->front == q->rear)//队空下溢出return false;q->front++;e = q->data[q->front];return true;
}

完整代码:

#include<iostream>
using namespace std;
typedef int ElemType;
#define MaxSiaze 50
typedef struct
{ElemType data[MaxSiaze];int front, rear;	//队头与队尾指针
}SqQueue;
//初始化队列
void InitQueue(SqQueue*& q)
{q = (SqQueue*)malloc(sizeof(SqQueue));q->front = q->rear = -1;
}
//销毁队列
void DestroyQueue(SqQueue*& q)
{free(q);
}
//判断队列是否为空
bool QueueEmpty(SqQueue*&q)
{return(q->front == q->rear);
}
bool enQueue(SqQueue*& q, ElemType e)
{if (q->rear == MaxSiaze - 1)	//队满上溢出return false;q->rear++;q->data[q->rear] = e;return true;
}
bool deQueue(SqQueue*& q, ElemType& e)
{if (q->front == q->rear)//队空下溢出return false;q->front++;e = q->data[q->front];return true;
}
int main() {return 0;
}

1.4队列的链式存储结构及其基本运算

链队:采用链式存储结构的队列

对于单链表实现的链队,在这种链队中只允许在单链表的表头进行删除操作和在表尾进行插入操作

链队的基本知识:

  • 队空的条件 q -->rear == NULL(也可以是q -->front == NULL)
  • 队满的条件:不考虑
  • 元素e的进队操作:新建一个结点存放元素e(由p指向它,将结点p插入作为尾结点)
  • 出队操作:取出队首结点的data值并将其删除

(1)声明

typedef int ElemType;
typedef struct qnode
{ElemType data;	//存放元素struct qnode* next;//下一个结点指针
}DataNode;
typedef struct
{DataNode* front; //指向队首结点DataNode* rear; //指向队首结点
}LinkQuNode;

(2)销毁队列

//销毁
void DestroyQueue(LinkQueue *&q)
{DataNode * pre = q->front,*p;	//pre指向队首结点 if(pre!=NULL){p = pre->next;				//p指向结点pre的后继结点 while(p!=NULL)				//p不空循环 {free(pre);				//释放pre结点 pre = p;				//同步后移 p = p->next;}free(pre);}free(q);
} 

(3)判断队列是否为空

bool QueueEmpty(LinkQueue *q)
{return (q-->rear == NULL)
}

(4)进队列

//进队列
void enQueue(LinkQuNode*& q,ElemType e)
{DataNode* p;p = (DataNode*)malloc(sizeof(DataNode));p->data = e;p->next = NULL;if (q->rear == NULL)//若链队为空,则新结点既是队首结点又是队尾结点q->front = q->rear = p;else{q->rear->next = p;	//将结点p链接到队尾,并将rear指向它q->rear = p;}
}

(5)出队列

//出队列
bool deQueue(LinkQuNode*& q, ElemType e)
{DataNode* t;if (q->rear == NULL)	//原来队列已经为空return false;t = q->front;			//指向首结点if (q->front == q->rear)	//原来队列中只有一个数据结点q->front = q->rear = NULL;elseq->front = q->front->next;e = t->data;free(t);return true;
}

完整代码:

#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct qnode
{ElemType data;	//存放元素struct qnode* next;//下一个结点指针
}DataNode;
typedef struct
{DataNode* front; //指向队首结点DataNode* rear; //指向队首结点
}LinkQuNode;//初始化
void InitQueue(LinkQuNode*& q)
{q = (LinkQuNode*)malloc(sizeof(LinkQuNode));q->front = q->rear = NULL;
}
//销毁
void DestroyQueue(LinkQueue *&q)
{DataNode * pre = q->front,*p;	//pre指向队首结点 if(pre!=NULL){p = pre->next;				//p指向结点pre的后继结点 while(p!=NULL)				//p不空循环 {free(pre);				//释放pre结点 pre = p;				//同步后移 p = p->next;}free(pre);}free(q);
} 
//进队列
void enQueue(LinkQuNode*& q,ElemType e)
{DataNode* p;p = (DataNode*)malloc(sizeof(DataNode));p->data = e;p->next = NULL;if (q->rear == NULL)//若链队为空,则新结点既是队首结点又是队尾结点q->front = q->rear = p;else{q->rear->next = p;	//将结点p链接到队尾,并将rear指向它q->rear = p;}
}
//出队列
bool deQueue(LinkQuNode*& q, ElemType e)
{DataNode* t;if (q->rear == NULL)	//原来队列已经为空return false;t = q->front;			//指向首结点if (q->front == q->rear)	//原来队列中只有一个数据结点q->front = q->rear = NULL;elseq->front = q->front->next;e = t->data;free(t);return true;
}
int main()
{return 0;
}

当然了,队列的形式多种多样,比如双端队列,循环队列等等。希望本文对你有所帮助
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从智能手机到智能机器人:小米品牌的高端化之路

原创 | 文 BFT机器人 前言 在前阵子落幕的2023世界机器人大会“合作之夜”上&#xff0c;北京经济技术开发区管委会完成了与世界机器人合作组织、小米机器人等16个重点项目签约&#xff0c;推动机器人创新链和产业链融合&#xff0c;其中小米的投资额达到20亿&#xff01; 据了…

C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

using System; using System.Threading; using System.Windows.Forms; using UtilForm.Util;namespace UtilForm {// 线程同步&#xff0c;事件触发&#xff0c;信号量&#xff0c;互斥锁&#xff0c;共享内存&#xff0c;消息队列public partial class frmUIThread : Form{ Sy…

鸿蒙应用程序入口UIAbility详解

一、UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。一个应用可以有一个UIAbility&am…

理解 React 服务器组件

自从 React 被引入开发社区以来的十年里&#xff0c;它经历了几次演变。React 团队在发生根本性变革时并不害羞&#xff1a;如果他们发现了一个更好的问题解决方案&#xff0c;他们就会带着它运行。 几个月前&#xff0c;React 团队推出了 React Server Components&#xff0c…

论文简读 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

论文地址&#xff1a;https://arxiv.org/pdf/2106.09685.pdf 项目地址&#xff1a;https://github.com/microsoft/LoRA 全文翻译地址&#xff1a;https://zhuanlan.zhihu.com/p/611557340 本来想自行翻译的&#xff0c;但最近没有空 1、关键凝练 1.1 LORA是什么&#xff1f; …

服务器中了Malloxx勒索病毒应该怎么办?勒索病毒解密,数据恢复

Malloxx勒索病毒是一种近年来发现的电脑病毒&#xff0c;它以加密用户电脑中的重要文件数据为手段&#xff0c;威胁用户并以此勒索钱财。这种病毒的传播方式多种多样&#xff0c;可以通过电子邮件、恶意网站、网络下载等方式进行传播。一旦电脑被感染&#xff0c;病毒会立即锁住…

数据结构之队列的实现(附源码)

目录 一、队列的概念及结构 二、队列的实现 拓展&#xff1a;循环队列 三、初学的队列以及栈和队列结合的练习题 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(Fi…

processflow流程图多人协作预热

前言 在线上办公如火如荼的今天&#xff0c;多人协作功能是每个应用绕不开的门槛。processflow在线流程图&#xff08;前身基于drawio二次开发&#xff09;沉寂两年之久&#xff0c;经过长时间设计开发&#xff0c;调整&#xff0c;最终完成了多人协作的核心模块设计。废话不多…

基于网络表示学习的 新闻推荐算法研究与系统实现

摘要 第1章绪论 新闻推荐通常是利用用户的阅读行为和习惯、阅读选择和爱好等信息,为 用户推荐新闻内容。新闻推荐能够减少用户在数量庞大数据信息中获取信息的 时间消耗,从而能够缓解“信息过载[7]”的难题。以文本为内容的新闻,和商品、 电影、短视频等推荐系统相比,新闻推…

【LeetCode】202. 快乐数 - hash表 / 快慢指针

目录 2023-9-5 09:56:152023-9-6 19:40:51 202. 快乐数 2023-9-5 09:56:15 关键是怎么去判断循环&#xff1a; hash表&#xff1a; 每次生成链中的下一个数字时&#xff0c;我们都会检查它是否已经在哈希集合中。 如果它不在哈希集合中&#xff0c;我们应该添加它。如果它在…

966SEO扫地僧站群·万能HTML模板[V1.9.1]

扫地僧站群万能HTML模板是一款站点管理软件,其主要特点是可以将原始的html模板放入程序中,无需编写任何标签,程序会全自动替换处理,从而快速构建出一个完整的网站,这种模式相对于传统的网站建设方式更加快速、简单,同时可以大幅度降低网站建设的成本和难度.服务器及域名量的配置…

PaddleOCR学习笔记2-初步识别服务

今天初步实现了网页&#xff0c;上传图片&#xff0c;识别显示结果到页面的服务。后续再完善。 采用flask paddleocr bootstrap快速搭建OCR识别服务。 代码结构如下&#xff1a; 模板页面代码文件如下&#xff1a; upload.html : <!DOCTYPE html> <html> <…