数据结构之顺序队列

数据结构之顺序队列

数据结构之队列

什么是队列

  • 队列是和栈一样操作受限的线性表,栈是只允许在线性表的一端进行入栈和出栈操作,而队列是会允许在线性表的一端进行入队,在另外一端进行出队操作

队列的基本操作

bool initQueue(Queue & Q); // 初始化队列
void destroyQueue(Queue Q); // 如果是顺序队列则不需要销毁
bool push(Queue & Q, ElemType x); // 入队
bool pop(Queue & Q, ElemType & x); // 出队
// 获取队头元素的值
void getTop(Queue Q, ELemType & x);
bool queueEmpty(Queue Q); // 判断队列是否为空

顺序队列

  • 用静态数组实现的队列(使用顺序存储结构实现的队列)缺点:空间固定
  • image-20251022001229395

顺序队列的代码实现

#include<stdio.h>
#define Elemtype int 
#define MaxSize 10
typedef struct SQueue{Elemtype data[MaxSize];size_t front,rear; // 队头和队尾指针(存储数组下标)
}SQueue;
bool initQueue(SQueue & Q)
{Q.front = 0;Q.rear = 0;
}
// 入队
bool push(Queue & Q, ElemType x)
{// 如果队列满了则返回falseif((Q.rear + 1) % MaxSize == Q.front)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear+1) % MaxSize;
}// 出队
bool pop(Queue & Q, ElemType & x)
{// 如果队列为空,则返回falseif(Q.front == Q.rear)return falsex = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;
}
// 获取队头元素的值
void getTop(Queue Q, ELemType & x){// 如果队列为空,则返回falseif(Q.front == Q.rear)return falsex = Q.data[Q.front];
}
// 判断队列是否为空
bool SqueueEmpty(SQueue Q);{if(Q.front == Q.rear)return true;return false;
}

代码缺陷

上述代码实现的队列,会浪费一个存储空间,如何避免浪费一个存储空间呢?

  1. 使用一个length变量,存储队列的长度
typedef struct SQueue{Elemtype data[MaxSize];size_t front,rear; // 队头和队尾指针(存储数组下标)Size_t length;
}SQueue;
bool initQueue(SQueue & Q)
{Q.front = 0;Q.rear = 0;Q.length = 0; // 计数器
}
// 入队
bool push(Queue & Q, ElemType x)
{// 如果队列满了则返回falseif(Q.front == Q.rear && Q.length == MaxSize)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear+1) % MaxSize;Q.length++;
}// 出队
bool pop(Queue & Q, ElemType & x)
{// 如果队列为空,则返回falseif(Q.front == Q.rear && Q.length == 0)return falsex = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.rear--;
}
  1. 使用一个flag变量,出队时将flag 置为0 , 入队将flag置为1
typedef struct SQueue{Elemtype data[MaxSize];size_t front,rear; // 队头和队尾指针(存储数组下标)bool flag;
}SQueue;
bool initQueue(SQueue & Q)
{Q.front = 0;Q.rear = 0;
}
// 入队
bool push(Queue & Q, ElemType x)
{// 如果队列满了则返回falseif(Q.front == Q.rear && Q.flag = 1)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear+1) % MaxSize;Q.flag = 1;
}// 出队
bool pop(Queue & Q, ElemType & x)
{// 如果队列为空,则返回falseif(Q.front == Q.rear && Q.flag == 0)return falsex = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.rear--;Q.flat = 0;
}

链式队列

  • 用链表实现的队列(存储空间不固定,根据内存来确定)
#include<stdio.h>
#include<stdlib.h>
#define ElemType inttypedef struct LinkNode { // 链式队列结点ElemType data;struct LinkNode* next;
}LinkNode;typedef struct {LinkNode* front, * rear; // 队列的队头和队尾指针
}LinkQueue;// 初始化链式队列
bool initLinkQueue(LinkQueue& LQ)
{LinkNode* n = (LinkNode*)malloc(sizeof(LinkNode));if (n == NULL)return false;n->next = NULL;LQ.front = n;LQ.rear = n;return true;
}
// 销毁链式队列
void destoryQueue(LinkQueue& LQ)
{LinkNode* cur = LQ.front->next;LinkNode* next;while (cur != NULL){next = cur->next;free(cur);cur = next;}free(LQ.front); // 释放头结点LQ.front = NULL;LQ.rear = NULL;
}
// 判断链式队列为空
bool isEmpty(LinkQueue LQ)
{if (LQ.front == LQ.rear)return true;elsereturn false;
}
// 入队
bool push(LinkQueue& LQ, ElemType x)
{LinkNode* n = (LinkNode*)malloc(sizeof(LinkNode));if (n == NULL)return false;n->data = x;n->next = NULL;LQ.rear->next = n;LQ.rear = n; // 修改队尾指针return true;
}
// 出队
bool pop(LinkQueue& LQ, ElemType& x)
{if (isEmpty(LQ)) // 判断链式队列是否为空return false;LinkNode* head = LQ.front;LinkNode* cur = head->next; // 当前要出的结点x = cur->data;head->next = cur->next;if (LQ.rear == cur) // 此次出队的是最后一个结点LQ.rear = LQ.front;free(cur); // 释放结点return true;
}
// 获取队头结点存放的数据
bool getTop(LinkQueue& LQ, ElemType& x)
{if (isEmpty(LQ)) // 判断链式队列是否为空return false;LinkNode* head = LQ.front;LinkNode* cur = head->next; // 队头结点x = cur->data;return true;
}
// 打印整个队列
void printQueue(LinkQueue LQ)
{LinkNode* cur = LQ.front->next;  // 作为遍历整个队列的结点if(!isEmpty(LQ)){while (cur != NULL){printf("%d <- ", cur->data);cur = cur->next;}printf("NULL\n");}
}// 测试函数
void test_LinkQueue(){LinkQueue LQ; initLinkQueue(LQ);push(LQ, 1);push(LQ, 2);push(LQ, 3);push(LQ, 4);printQueue(LQ);ElemType x = 0;pop(LQ, x);pop(LQ, x);printQueue(LQ);}int main()
{test_LinkQueue();return 0;
}

队列的变种(双端队列)

双端队列:受限制的线性表,可以在线性表的两端进行插入和删除操作

  1. 双端队列只允许在队列的一端进行插入和删除操作就等价于栈
  2. 输入受限的双端队列: 只允许一端进行插入,两端允许删除的线性表
  3. 输出受限的双端队列: 只允许一段进行删除,两段允许插入的线性表

练习题:判断输出序列合法性

若数据元素输入序列为1,2,3,4,5 则哪些输出序列是合法的,哪些是非法的?

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

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

相关文章

nginx快速实现平滑版本升级

1、解压并编译新版的nginx # 目前版本为1.18,解压一个1.21版本的nginx包 wget https://nginx.org/download/nginx-1.21.0.tar.gz tar -zxf nginx-1.21.0.tar.gz cd nginx-1.21.0/ [root@ubt-server nginx-1.21.0]# ls…

基础的sql练习,全都理解你就是高手了!

以下sql我都是亲测:大多数用法都会在面试当中被问到,切记一步一个脚印的去实现,结果不重要,重要的是你的实现过程的想法,第一步做什么然后第二步做什么等具体的详细过程!(学东西不能贪多,慢慢来) 先从单表查询…

Luogu P11159 【MX-X6-T5】 再生 题解 [ 蓝 ] [ 前缀和 ] [ 组合计数 ]

再生 笑点解析:一开始乘法原理推错式子胡了个依赖链长种类数 \(\le \sqrt n\) 的做法上去。 有了 \(top\) 数组,显然可以求出每个点所处的长链。对于长链上的点,如果链长为 \(x\),那么这条链有 \((x - 1)!\) 种可能…

王浩宇 102500416

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

102500416 王浩宇

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

程序员修炼之路:从小工到专家 读书笔记 2

《程序员修炼之道:从小工到专家》读书笔记(补充篇) 重读《程序员修炼之道》,除了此前感悟的核心原则,书中 “破窗理论”“原型验证”“责任承诺” 等理念,更让我看清从 “完成代码” 到 “掌控开发” 的进阶细节…

程序员修炼之路:从小工到专家 读书笔记 3

《程序员修炼之道:从小工到专家》读书笔记(进阶篇) 三读《程序员修炼之道》,书中 “知识负债”“自动化思想”“沟通协作” 三大被忽略的理念,终于让我触摸到 “专家” 的核心特质 —— 不仅是技术能力的精进,更…

程序员修炼之道:从小工到专家 读书笔记 1

《程序员修炼之道:从小工到专家》读书笔记 翻开《程序员修炼之道:从小工到专家》,没有复杂的代码堆砌,却满是对程序员职业成长的深刻洞察。这本书更像一位资深前辈的经验分享,指引着开发者跳出 “代码搬运工” 的…

解答在同步以太坊事件数据时,如何保证后端服务在 API/RPC 不稳定情况下的可用性

我来详细解答在同步以太坊事件数据时,如何保证后端服务在 API/RPC 不稳定情况下的可用性: 1. 以太坊事件同步的挑战 事件同步的特点 package mainimport ("context""fmt""log""t…

中级问题

我来详细解答这些区块链和 Go 后端开发的问题: 18. Merkle Tree 在区块链中的作用 Merkle Tree 定义 Merkle Tree 是一种二叉树结构,用于高效验证大量数据的完整性。 在区块链中的作用 // 区块链中的 Merkle Tree 应…

20251021周二日记

20251021周二日记这阅读量是怎么回事?有熟人看到吗,哈喽啊/ 今日: 1.早上睡到十点多,紧急去实验室继续报账,填系统,这次应该差不多了。 2.中午统一定的袁记,简单吃完下午上课去,帮报信和写题,下课回549了。 h…

好想好想你

喝了四两酒喝的酒 一股子我们在机场喝的人参酒味 眼前画面一帧一帧 脑子好像灌了水银 身体不由自主 很想你 我要是现在死掉就好了 让我们的故事成为一个完美的童话

10.21日学习笔记

HBase 增量迁移:TB 级历史表 0 停机上云 场景 本地 2.3 TB 的 msg_his 表 → 阿里云 HBase 2.0(LTS 版),要求白天业务可读可写,只容忍 5 min 最终切换窗口。 方案选型 采用“Snapshot + Replication 双轨 + 增量校…

第1天(简单题 基础语法 数据类型、条件判断 、循环 循环嵌套、位运算, ASCII 码)

打卡第一天 做8道简单题找回一些手感 第五题的异或运算卡了很久,离散数学没学好...看了解题方法还是不会(不用数学的解题思路✔) 数据库原理两道题,现学MySQL半小时就放弃了^^ 今日耗时≈两小时 明天继续

24信计2班 17曾向嵩 pytorch读书报告

卷积神经网络(CNN)学习读书报告 ——基于B站《从LeNet到ResNet:CNN架构演进与核心原理》视频的深度解析 一、引言:学习背景与视频概况 在计算机视觉技术迅猛发展的当下,卷积神经网络(CNN)作为突破传统图像识别瓶…

Go 语言问题解释

我来为每个 Go 语言问题补充详细的文字解释: 1. Go 基本数据类型 - 文字解释 数值类型 Go 语言提供了丰富的数值类型,包括有符号和无符号整数、浮点数、复数等。这些类型的设计考虑了不同平台和性能需求:整数类型:…

Keil_v5的用法

1、包的管理本文来自博客园,作者:变秃了也就变强了,转载请注明原文链接:https://www.cnblogs.com/lichangyi/p/19156680

OI 笑传 #21

WorldendGirlfriendワールドエンドガールフレンド 今天是周天 VP 的洛谷的 S 模拟。 结果起晚了。。。十点才开题。打了 3h。 结果是 \(100+100+0+0=200\),T3 暴力没打,T4 啥也不会。大样例挺牛的,都过了就不会挂分…

[Tool] lsof: 列出打开的文件描述符

[Tool] lsof: 列出打开的文件描述符$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");目录1. 概述2. 前提条件3. 常用选项和用法4. 常用示例4.1 查看指定进程…