【数据结构】线性表(八)队列:顺序队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)

文章目录

  • 一、队列
    • 1. 定义
    • 2. 基本操作
  • 二、顺序队列
    • 0. 顺序表
    • 1. 头文件和常量
    • 2. 队列结构体
    • 3. 队列的初始化
    • 4. 判断队列是否为空
    • 5. 判断队列是否已满
    • 6. 入队
    • 7. 出队
    • 8. 存取队首元素
    • 9. 主函数
    • 10. 代码整合

  堆栈Stack 和 队列Queue是两种非常重要的数据结构,两者都是特殊的线性表:

  • 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行;
  • 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。

一、队列

1. 定义

  队列是一种操作受限的线性表,对于它的所有插入都在表的一端进行,所有的删除(以至几乎所有的存取)都在表的另一端进行,且这些操作又都是按照先进先出(FIFO)的原则进行的。进行删除的一端称为队头(front),进行插入的一端称为队尾(rear)。没有元素的队列称为空队列(简称空队)。

在这里插入图片描述
  队列就像生活中排队购物,新来的人只能加入队尾(假设不允许插队),购物结束后先离开的总是队头(假设无人中途离队)。也就是说,先加入队列的成员总是先离开队列,因此队列被称为先进先出(First In First Out)的线性表,简称为FIFO表。如图,在空队列中依次加入元素a1,a2,a3,a4,a5,出队次序仍然是a1,a2,a3,a4,a5 .

2. 基本操作

  • 队列是受限的线性表,其基本操作包括

    • IsEmpty() : 判断队列是否为空;
    • isFull():判断队列是否为满;
    • enqueue() :向队尾添加元素(入队);
    • dequeue() :删除队首元素(出队);
    • peek():获取队首的元素值(存取);
  • 同普通线性表一样,队列也可以用顺序存储和链接存储两种方式来实现:

二、顺序队列

  用顺序存储方式实现的堆栈称为顺序队列

0. 顺序表

参考前文:顺序表及其基本操作

1. 头文件和常量

#include <stdio.h>
#define MAX_SIZE 100
  • 头文件stdio.h用于输入输出操作

  • 通过#define指令定义了一个常量MAX_SIZE,它表示顺序队列中数组的最大容量为100

2. 队列结构体

typedef struct {int data[MAX_SIZE]; // 存储队列元素的数组int front;          // 队头指针int rear;           // 队尾指针
} SequentialQueue;
  • 整型数组 data,用于存储队列元素;
  • frontrear 分别表示队头指针和队尾指针。

3. 队列的初始化

void initSequentialQueue(SequentialQueue* queue) {queue->front = -1;queue->rear = -1;
}

   initSequentialQueue 函数:初始化顺序队列,它将队头指针和队尾指针都设置为 -1,表示队列为空。

4. 判断队列是否为空

int isSequentialQueueEmpty(SequentialQueue* queue) {return queue->front == -1;
}

   isSequentialQueueEmpty 函数用于判断顺序队列是否为空:如果队头指针为 -1,表示队列为空,返回 1;否则返回 0。

5. 判断队列是否已满

int isSequentialQueueFull(SequentialQueue* queue) {return (queue->rear + 1) % MAX_SIZE == queue->front;
}

   isSequentialQueueFull 函数用于判断顺序队列是否已满。

6. 入队

void enqueueSequentialQueue(SequentialQueue* queue, int data) {if (isSequentialQueueFull(queue)) {printf("Error: Queue is full\n");return;}if (isSequentialQueueEmpty(queue)) {queue->front = 0;queue->rear = 0;} else {queue->rear = (queue->rear + 1) % MAX_SIZE;}queue->data[queue->rear] = data;
}
  • 判断队列是否已满
    • 如果已满则打印错误信息并返回;
    • 否则,根据队列是否为空进行不同的处理:
      • 如果队列为空,将队头指针和队尾指针都设置为 0;
      • 否则,将队尾指针移动到下一个位置,并将元素存储到队尾指针所指向的位置。

7. 出队

int dequeueSequentialQueue(SequentialQueue* queue) {if (isSequentialQueueEmpty(queue)) {printf("Error: Queue is empty\n");return -1;}int data = queue->data[queue->front];if (queue->front == queue->rear) {queue->front = -1;queue->rear = -1;} else {queue->front = (queue->front + 1) % MAX_SIZE;}return data;
}
  • 判断队列是否为空
    • 如果为空则打印错误信息并返回 -1;
    • 否则,取出队头元素,并根据队头指针是否等于队尾指针来判断队列是否为空:
      • 如果队列为空,将队头指针和队尾指针都设置为 -1;
      • 否则,将队头指针移动到下一个位置。

8. 存取队首元素

int peekSequentialQueue(SequentialQueue* queue) {if (isSequentialQueueEmpty(queue)) {printf("Error: Queue is empty\n");return -1;}return queue->data[queue->front];
}

   peekSequentialQueue 函数用于获取队首元素,即返回队列中队头指针所指向的元素的值。首先判断队列是否为空,如果为空则打印错误信息并返回 -1。

9. 主函数

int main() {SequentialQueue queue;initSequentialQueue(&queue);enqueueSequentialQueue(&queue, 10);enqueueSequentialQueue(&queue, 20);enqueueSequentialQueue(&queue, 30);printf("Peek: %d\n", peekSequentialQueue(&queue));printf("Dequeued: %d\n", dequeueSequentialQueue(&queue));printf("Dequeued: %d\n", dequeueSequentialQueue(&queue));printf("Peek: %d\n", peekSequentialQueue(&queue));enqueueSequentialQueue(&queue, 40);printf("Peek: %d\n", peekSequentialQueue(&queue));return 0;
}
  • 声明了一个 SequentialQueue 类型的变量 queue
  • 调用 initSequentialQueue 函数对其进行初始化
  • 调用 enqueueSequentialQueue 函数三次,依次将元素 10、20、30 入队
  • 使用 peekSequentialQueue 函数获取队首元素并打印
  • 调用 dequeueSequentialQueue 函数两次,依次将队列中的元素出队并打印
  • 再次使用 peekSequentialQueue 函数获取队首元素并打印
  • 调用 enqueueSequentialQueue 函数将元素 40 入队,并使用 peekSequentialQueue 函数获取队首元素并打印

在这里插入图片描述

10. 代码整合

#include <stdio.h>
#define MAX_SIZE 100// 定义顺序队列
typedef struct {int data[MAX_SIZE]; // 存储队列元素的数组int front;          // 队头指针int rear;           // 队尾指针
} SequentialQueue;// 初始化顺序队列
void initSequentialQueue(SequentialQueue* queue) {queue->front = -1;queue->rear = -1;
}// 判断顺序队列是否为空
int isSequentialQueueEmpty(SequentialQueue* queue) {return queue->front == -1;
}// 判断顺序队列是否已满
int isSequentialQueueFull(SequentialQueue* queue) {return (queue->rear + 1) % MAX_SIZE == queue->front;
}// 入队
void enqueueSequentialQueue(SequentialQueue* queue, int data) {if (isSequentialQueueFull(queue)) {printf("Error: Queue is full\n");return;}if (isSequentialQueueEmpty(queue)) {queue->front = 0;queue->rear = 0;} else {queue->rear = (queue->rear + 1) % MAX_SIZE;}queue->data[queue->rear] = data;
}// 出队
int dequeueSequentialQueue(SequentialQueue* queue) {if (isSequentialQueueEmpty(queue)) {printf("Error: Queue is empty\n");return -1;}int data = queue->data[queue->front];if (queue->front == queue->rear) {queue->front = -1;queue->rear = -1;} else {queue->front = (queue->front + 1) % MAX_SIZE;}return data;
}// 获取队首元素
int peekSequentialQueue(SequentialQueue* queue) {if (isSequentialQueueEmpty(queue)) {printf("Error: Queue is empty\n");return -1;}return queue->data[queue->front];
}// 示例代码的主函数
int main() {SequentialQueue queue;initSequentialQueue(&queue);enqueueSequentialQueue(&queue, 10);enqueueSequentialQueue(&queue, 20);enqueueSequentialQueue(&queue, 30);printf("Peek: %d\n", peekSequentialQueue(&queue));printf("Dequeued: %d\n", dequeueSequentialQueue(&queue));printf("Dequeued: %d\n", dequeueSequentialQueue(&queue));printf("Peek: %d\n", peekSequentialQueue(&queue));enqueueSequentialQueue(&queue, 40);printf("Peek: %d\n", peekSequentialQueue(&queue));return 0;
}

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

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

相关文章

美格智能出席无锡智能网联汽车生态大会,共话数字座舱新势力

10月20日&#xff0c;2023世界物联网博览会期间&#xff0c;以“智 行天下 启未来”为主题的2023无锡智能网联汽车生态大会暨域控制器及智能座舱论坛在无锡举行。大会邀请行业权威专家&#xff0c;多家知名企业重磅嘉宾出席&#xff0c;融汇智能网联汽车思想智慧、创新技术、产…

微信小程序连接数据库与WXS的使用

微信小程序连接数据库与WXS的使用 1.搭建数据库连接,使用后端获取数据1.请求方式的封装2.化一下代码&#xff0c;这样写太繁琐了3.前端代码 四、WXS的使用1..解决数据显示数字问题2. 解决统计人数问题3.解决时间进制问题 ) 1.搭建数据库连接,使用后端获取数据 为了后期方便维护…

李m圆申论

听话出活 3小时 /处理7500字 /一共5题 /写出2200字 字写得好看点&#xff0c;符号也算字数&#xff0c;占一个格 基本思路&#xff1a;考什么范围答什么 。。。落后&#xff1b;资源闲置、缺乏 申论&#xff1a; 作文题&#xff1a;举例子 处理材料 摘抄&#xff1a; 有人出…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测

1. 概述 1.1 什么是集成模型/集成学习 "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起&#xff0c;以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果&#xff0c;集成学习可以减少单个模型的偏差和方差&am…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

RunnerGo 支持UI自动化的测试平台

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…

Leetcode——字符

520. 检测大写字母 class Solution { public:bool detectCapitalUse(string word) {int big 0, small 0, len word.length();for (int i 0; i < len; i) {if (word[i] > 65 && word[i] < 90) {big;}else {small;}}if (big len || small len) {return tr…

工业电子中的深力科分享一款PWM控制器 KA3525A

关于PWM控制器&#xff1a; PWM控制器是一种用于控制电机或其他设备的电路&#xff0c;它通过改变脉冲宽度调制&#xff08;PWM&#xff09;信号的占空比来控制设备的输出。PWM控制器可以使用单片机或开发板等设备来实现&#xff0c;通过设定占空比&#xff0c;可以轻松地控制…

【微信小程序调试工具试用】

【微信小程序调试工具试用】 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09;本次工具分享到此结束 什么是爬虫逆向&#xff1f; 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09; 1 如图 下面小程序…

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

本文目录 前言Step 1 MIKE文件转shpStep 2 在ArcGIS中打开shp统计相应指标拓展&#xff1a;关于shp文件的介绍 前言 MIKE的工具箱中自带一个转shp的工具&#xff0c;然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。 Step 1 MIKE文件转shp MIKE允许转…

SSM - Springboot - MyBatis-Plus 全栈体系(三十四)

第八章 项目实战 四、后台功能开发 1. 用户模块开发 1.1 jwt 和 token 介绍 1.1.1 token 介绍 令牌&#xff08;Token&#xff09;&#xff1a;在计算机领域&#xff0c;令牌是一种代表某种访问权限或身份认证信息的令牌。它可以是一串随机生成的字符或数字&#xff0c;用…

Python哪个版本最稳定好用2023.10.19

环境&#xff1a; win10 专业版 Python 问题描述&#xff1a; python哪个版本最稳定好用 解决方案&#xff1a; 目前&#xff0c;Python 的最新版本是 3.11.0。然而&#xff0c;对于大多数用户来说&#xff0c;Python 3.8 和 3.9 是最稳定和好用的版本&#xff0c;因为它们…

下拉选择框监听el-option的方式

<el-select v-model"form.expenseType" placeholder"请选择费用类型" clearable filterable size"small"><el-option v-for"item in expenseNameList" :key"item.value" :label"item.label" :value"…

python控制负数以16进制整型格式输出

实际使用时候&#xff0c;发现 python输出负数进程是 十进制和16进制一样的&#xff0c;就是16进制多了一个负号&#xff0c;和预期结果不同&#xff1b;比如我想要 -1输出 0xFFFFFFFF&#xff0c;可以参考如下方式&#xff1b; def TestPrintf(): ret -3print("test1 r…

csapp-Machine-Level Representation of Program-review

Machine-Level Representation of Program收获和思考 Basics Machine-Level Programming可以看成是机器执行对于上层代码的一种翻译&#xff0c;即硬件是如何通过一个个的指令去解释每一行代码&#xff0c;然后操纵各种硬件执行出对应的结果。 Machine-Level Programming有2种…

根据Excel表格数据去修改数据库数据

一、背景 项目上线&#xff0c;实施任务发来一份Excel表格数据 需要将供应商和生产厂商进行绑定&#xff0c;因为数据过多&#xff0c;实施人员一个个绑定时间成本过高&#xff0c;想让开发给出一个脚本。 二、操作 比如这些数据 生产厂商为A 供应商为B 以update 语句为例 …

怎么理解函数式编程思维?

文章目录 &#xff08;2023年9.29号&#xff0c;正月十五家乡的月亮&#xff09; ​ 理解函数式编程要注重思维的转变。函数式编程聚焦于简洁的高阶函数&#xff0c;高阶函数注重封装底层运作原理来解决复杂的业务场景&#xff0c;比如 Scala、Groovy、Clojure 语言&#xff1a…

webrtc gcc算法(1)

老的webrtc gcc算法,大概流程&#xff1a; 这两个拥塞控制算法分别是在发送端和接收端实现的&#xff0c; 接收端的拥塞控制算法所计算出的估计带宽&#xff0c; 会通过RTCP的remb反馈到发送端&#xff0c; 发送端综合两个控制算法的结果得到一个最终的发送码率&#xff0c;并以…

iZotope RX 10for Mac /Windows- 音频修复的终极解决方案

随着音乐和电影制作的复杂性日益增加&#xff0c;高质量的音频修复变得越来越重要。iZotope RX 10&#xff0c;作为业界公认的专业音频修复软件&#xff0c;为你提供了强大、精确的工具&#xff0c;让你的声音变得清晰、纯净。 在音频修复领域&#xff0c;iZotope RX 10凭借其…