线性表之队列

主要内容

  1. 队列

一.队列

队列是一种先进先出(FIFO,First In First Out)的线性数据结构,它具有两个基本操作:入队(enqueue)和出(dequeue)。入队操作在队列的末尾添加一个元素,出队操作从队列的头部移除一个元素。

1.队列的顺序存储

代码如下(示例):

队列的顺序存储结构通常使用数组来实现,可以通过数组的下标来表示队列的头部和尾部,以及元素的添加和移除。下面是队列的顺序存储结构的示例代码:

C语言实现:

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100// 定义队列结构
typedef struct {int data[MAX_SIZE];int front;  // 队头指针int rear;   // 队尾指针
} Queue;// 初始化队列
void initQueue(Queue *queue) {queue->front = 0;queue->rear = 0;
}// 判断队列是否为空
int isEmpty(Queue *queue) {return queue->front == queue->rear;
}// 入队
void enqueue(Queue *queue, int value) {if ((queue->rear + 1) % MAX_SIZE == queue->front) {printf("Queue is full\n");return;}queue->data[queue->rear] = value;queue->rear = (queue->rear + 1) % MAX_SIZE;
}// 出队
int dequeue(Queue *queue) {if (isEmpty(queue)) {printf("Queue is empty\n");return -1;}int value = queue->data[queue->front];queue->front = (queue->front + 1) % MAX_SIZE;return value;
}int main() {Queue queue;initQueue(&queue);enqueue(&queue, 1);enqueue(&queue, 2);enqueue(&queue, 3);printf("Dequeued: %d\n", dequeue(&queue));printf("Dequeued: %d\n", dequeue(&queue));printf("Dequeued: %d\n", dequeue(&queue));return 0;
}
在这个示例中,我们使用了一个数组来存储队列的元素,
同时使用front和rear指针来表示队列的头部和尾部。
enqueue函数用于将元素添加到队列中,dequeue函数用于从队列中移除元素。
通过这种方式,我们可以使用数组来实现队列的顺序存储结构。

Python实现:

class ArrayQueue:def __init__(self, capacity):self.capacity = capacityself.queue = [None] * capacityself.front = 0self.rear = 0def enqueue(self, item):if (self.rear + 1) % self.capacity == self.front:raise Exception("Queue is full")self.queue[self.rear] = itemself.rear = (self.rear + 1) % self.capacitydef dequeue(self):if self.front == self.rear:raise Exception("Queue is empty")item = self.queue[self.front]self.front = (self.front + 1) % self.capacityreturn item

2.队列的链式存储

队列的链式存储结构通常使用链表来实现,每个节点表示队列中的一个元素,通过指针来连接各个节点。下面是队列的链式存储结构的示例代码:

C语言实现:

typedef struct QueueNode {int data;               // 队列中的元素struct QueueNode *next; // 指向下一个节点的指针
} QueueNode;typedef struct {QueueNode *front;       // 指向队头节点的指针QueueNode *rear;        // 指向队尾节点的指针
} Queue;

其中,QueueNode 表示队列中的一个节点,包含一个 data 成员表示节点中存储的元素,以及一个 next成员表示指向下一个节点的指针。

Queue 表示队列本身,包含两个指针成员 frontrear,分别指向队头和队尾节点。

创建一个空队列可以用如下的代码:

Queue *createQueue() {Queue *q = (Queue *)malloc(sizeof(Queue));q->front = q->rear = NULL;return q;
}

入队操作可以用如下的代码实现:

void enqueue(Queue *q, int data) {QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode));newNode->data = data;newNode->next = NULL;if (q->rear == NULL) {q->front = q->rear = newNode;} else {q->rear->next = newNode;q->rear = newNode;}
}

出队操作可以用如下的代码实现:

int dequeue(Queue *q) {if (q->front == NULL) {printf("Queue is empty.\n");return -1;}int data = q->front->data;QueueNode *temp = q->front;q->front = q->front->next;free(temp);if (q->front == NULL) {q->rear = NULL;}return data;
}
需要注意的是,当队列为空时进行出队操作会导致错误,
因此在出队操作前需要先检查队列是否为空。

Python实现:

class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedQueue:def __init__(self):self.front = Noneself.rear = Nonedef enqueue(self, item):new_node = Node(item)if self.rear is None:self.front = new_nodeself.rear = new_nodeelse:self.rear.next = new_nodeself.rear = new_nodedef dequeue(self):if self.front is None:raise Exception("Queue is empty")item = self.front.dataself.front = self.front.nextif self.front is None:self.rear = Nonereturn item

3.双端队列

双端队列(deque)是一种具有队列和栈特性的数据结构,可以在队列的两端进行插入和删除操作。双端队列受限于元素的插入和删除操作只能在两端进行,不能在中间进行。

双端队列的相关示例包括:浏览器的前进和后退功能、打印机的打印任务队列等。

C语言示例:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int front, rear;
} Deque;void initDeque(Deque *deque) {deque->front = 0;deque->rear = -1;
}bool isFull(Deque *deque) {return (deque->rear == MAX_SIZE - 1) || (deque->front == 0 && deque->rear == MAX_SIZE - 1);
}bool isEmpty(Deque *deque) {return (deque->front > deque->rear);
}void insertFront(Deque *deque, int value) {if (isFull(deque)) {printf("Deque is full\n");return;}deque->data[--deque->front] = value;
}void insertRear(Deque *deque, int value) {if (isFull(deque)) {printf("Deque is full\n");return;}deque->data[++deque->rear] = value;
}int deleteFront(Deque *deque) {if (isEmpty(deque)) {printf("Deque is empty\n");return -1;}return deque->data[deque->front++];
}int deleteRear(Deque *deque) {if (isEmpty(deque)) {printf("Deque is empty\n");return -1;}return deque->data[deque->rear--];
}int main() {Deque deque;initDeque(&deque);insertFront(&deque, 1);insertRear(&deque, 2);insertFront(&deque, 3);insertRear(&deque, 4);printf("Deleted from front: %d\n", deleteFront(&deque));printf("Deleted from rear: %d\n", deleteRear(&deque));return 0;
}

Python示例:

from collections import dequedeque = deque()deque.appendleft(1)
deque.append(2)
deque.appendleft(3)
deque.append(4)print("Deleted from front:", deque.popleft())
print("Deleted from rear:", deque.pop())

总结

以上是今天要讲的内容,学到了队列相关知识。

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

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

相关文章

什么是路由抖动?该如何控制

路由器在实现不间断的网络通信和连接方面发挥着重要作用&#xff0c;具有所需功能的持续可用的路由器可确保其相关子网的良好性能&#xff0c;由于网络严重依赖路由器的性能&#xff0c;因此确保您的路由器不会遇到任何问题非常重要。路由器遇到的一个严重的网络问题是路由抖动…

Java自学过程中的学习技巧与方法分享

问题&#xff1a;请解释一下SELECT语句在单表查询中的作用&#xff0c;并结合示例代码说明如何使用SELECT语句进行单表查询。 答案&#xff1a; 在数据库中&#xff0c;使用SELECT语句进行单表查询是非常常见和基础的操作。SELECT语句用于从数据库表中检索数据&#xff0c;可…

使用 watch+$nextTick 解决Vue引入组件无法使用问题

问题描述&#xff1a; 很多时候我们都需要使用第三方组件库&#xff0c;比如Element-UI&#xff0c;Swiper 等等。 如果我们想要在这些结构中传入自己从服务器请求中获取的数据就会出现无法显示的问题。 比如我们在下面的Swiper例子中&#xff0c;我们需要new Swiper 才能让…

【华为OD题库-043】二维伞的雨滴效应-java

题目 普通的伞在二维平面世界中&#xff0c;左右两侧均有一条边&#xff0c;而两侧伞边最下面各有一个伞坠子&#xff0c;雨滴落到伞面&#xff0c;逐步流到伞坠处&#xff0c;会将伞坠的信息携带并落到地面&#xff0c;随着日积月累&#xff0c;地面会呈现伞坠的信息。 1、为了…

mysql主从复制-redis集群扩容缩容、缓存优化(缓存更新策略、穿透,击穿,雪崩)、mysql主从搭建、django实现读写分离

基于Docker实现读写分离 1 redis集群扩容缩容 1.1 集群扩容 1.2 集群缩容 2 缓存优化 2.1 缓存更新策略 2.2 穿透&#xff0c;击穿&#xff0c;雪崩 3 mysql主从搭建 4 django实现读写分离 1 redis集群扩容缩容 1.1 集群扩容 # 6台机器&#xff0c;3个节点集群# 8台机器&am…

第12关 精通K8s下的Ingress-Nginx控制器:生产环境实战配置指南

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;这节课带来k8s的流量入口ingress&#xff0c;作为业务对外服务的公网入口&#xff0c;它的重要性不言而喻&#xff0c;大家一定要仔细阅读&#xff0c;跟着博哥的教程一步步实操去理…

一文总结Java获取文件后缀名的所有方法

Java是一种应用广泛的编程语言,可以通过多种方式来实现对文件的操作&#xff0c;如文件名后缀、文件扩展名等&#xff0c;下面这篇文章主要给大家介绍了关于Java获取文件后缀名的所有方法,需要的朋友可以参考下 一、研究背景 在我们实际的项目开发中&#xff0c;我们会经常对…

HTML5语法总结大全(持续更新中~)

参考书籍&#xff1a; 《HTML与CSS3基础教程》 参考视频&#xff1a; HTML5完整教学通俗易懂 2023新版前端Web开发HTML5CSS3移动web视频教程&#xff0c;前端web入门首选黑马程序员 参考网站&#xff1a; w3school 文章目录 零.开发环境准备1.需要的工具2.Vscode所需要插件3.其…

智能优化算法应用:基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混合蛙跳算法4.实验参数设定5.算法结果6.参考…

Snagit 2024.0.1(Mac屏幕截图软件)

Snagit 2024是一款屏幕截图工具&#xff0c;可以帮助用户轻松捕获、编辑和分享屏幕截图。该工具在Mac上运行&#xff0c;旨在满足用户对于屏幕截图的各种需求。 Snagit 2024支持屏幕录制功能&#xff0c;可以录制摄像头和麦克风等外部设备&#xff0c;让用户录制更加全面的视频…

Redis基本操作及使用

&#x1f4d1;前言 本文主要是【Redis】——Redis基本操作及使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

vue2.0 中央控制总线 Bus

vue2.0 中央控制总线 Bus 1. 废话不多说&#xff0c;直接上代码 2. main.js中 加入 // main.js //创建中央控制总线 Bus // 说白了就是new一个vue实例&#xff0c;将方法挂在上去 Vue.prototype.$event new Vue();事件分发***&#xff08;A组件中&#xff09;*** // A组件中…

springboot 自定义starter逐级抽取

自定义starter 背景:各个组件需要引入starter 还有自己的配置风格 –基本配置原理 &#xff08;1&#xff09;自定义配置文件 导入配置可以在配置文件中自动识别&#xff0c;提示 导入依赖后可以发现提示 &#xff08;2&#xff09;配置文件实现 –让配置文件对其他模块生…

酵母双杂交服务专题(二)

在理解了蛋白互作关系基础之上&#xff0c;为了解析它们的互作机制&#xff0c;往往还需要对其上下游通路上的基因进行分析。蛋白质之间的相互作用通过促进或抑制下游基因的转录&#xff0c;从而影响细胞的一系列生命过程。酵母单杂交技术是一种研究蛋白和DNA相互作用的常用手段…

安卓底部导航栏BottomNavigationView

目录 1. BottomNavigationView (1) 准备BottomNavigationView使用的菜单资源文件 (2) 准备颜色选择器 (3) BottomNavigationView控件设置 (4) 在Java代码中设置OnItemSelectedListener监听器 (5) 与Fragment配合 2. BottomTabBar 实现安卓底部导航栏&#xff0c;google为…

5面试题--redis

慢查询⽇志&#xff1a;⽤于记录执⾏时间超过给定时⻓的命令请求&#xff0c;⽤户可以通过这个功能产⽣的⽇志来监视和 优化查询速度。 布隆过滤器&#xff1a;⼆进制数组进⾏存储&#xff0c;若判断元素存在则可能实际存在&#xff0c;若判断不存在则⼀定不存在。 redis中inc…

C语言——一个数如果恰好等于它的因子之和,这个数就称为“完全数”。

一个数如果恰好等于它的因子之和,这个数就称为“完全数”。例如,6的因子是 1、2、3,而6123。因此6是一个完全数。编程找出 1000 之内的所有完全数。 #include <stdio.h> int main() {int i, j, sum;for (i 1; i < 1000; i) {sum 0; //这一步很重要&#xff0c;每…

Ubuntu:安装Powershell

Powershell的安装与使用&#xff1a; 1&#xff09;安装Powershell&#xff1a;在终端依次运行以下命令即可&#xff1a; $ sudo apt-get update $ sudo apt-get install -y wget apt-transport-https software-properties-common $ wget -q "https://packages.microsof…

【Linux驱动开发】环境搭建Linux驱动开发环境

环境搭建Linux驱动开发环境 1. 简单描述2. 资源3. 安装4. 基本操作和设置 1. 简单描述 基于讯为电子rk3568教程 2. 资源 下载 VMware Workstation Pro 17 链接 Ubuntu 桌面版&#xff08;64位&#xff09; 链接 3. 安装 需要选择自定义硬件&#xff08;内存大于16g 硬盘500g…

java: Internal error in the mapping processor: java.lang.NullPointerException

启动java项目出错&#xff0c;其他人工程没有问题&#xff0c;别着急。 java: Internal error in the mapping processor: java.lang.NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifestUrl(DefaultVersionInformation.j…