数据结构--双端队列

数据结构–双端队列

双端队列(Double-ended Queue,简称Deque)是一种具有队列和栈特性的数据结构,可以在队列的两端进行插入和删除操作。双端队列允许从前端和后端同时进行插入和删除操作,因此可以称为“两端都可以进出的队列”。

双端队列的特点包括:

  1. 可以在队列的头部和尾部进行插入和删除操作。
  2. 元素的插入和删除操作可以分别称为入队和出队操作。
  3. 可以实现先进先出(FIFO)和后进先出(LIFO)两种操作方式。
  4. 可以用于实现栈、队列以及其他需要在两端进行插入和删除操作的场景。

双端队列的常见操作包括:

  1. 在队列头部插入元素(头部入队):将元素插入到队列头部。
  2. 在队列尾部插入元素(尾部入队):将元素插入到队列尾部。
  3. 从队列头部删除元素(头部出队):删除队列头部的元素并返回。
  4. 从队列尾部删除元素(尾部出队):删除队列尾部的元素并返回。
  5. 获取队列头部的元素:返回队列头部的元素,但不删除。
  6. 获取队列尾部的元素:返回队列尾部的元素,但不删除。
  7. 判断队列是否为空:判断队列中是否有元素。
  8. 获取队列中的元素个数:返回队列中元素的个数。

双端队列的实现方式有多种,包括使用数组、链表等数据结构。具体的实现方式可以根据不同的需求和场景选择合适的方式。

常用操作代码实现

#include <stdio.h>
#include <stdlib.h>// 定义双端队列节点结构体
typedef struct Node {int data;           // 数据域struct Node* next;  // 指针域,指向下一个节点
} Node;// 定义双端队列结构体
typedef struct Deque {Node* front;  // 队头指针Node* rear;   // 队尾指针
} Deque;// 初始化双端队列
Deque* initializeDeque() {Deque* deque = (Deque*)malloc(sizeof(Deque));deque->front = NULL;deque->rear = NULL;return deque;
}// 判断双端队列是否为空
int isEmpty(Deque* deque) {return (deque->front == NULL);
}// 在队头插入元素
void insertFront(Deque* deque, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(deque)) {deque->front = newNode;deque->rear = newNode;} else {newNode->next = deque->front;deque->front = newNode;}
}// 在队尾插入元素
void insertRear(Deque* deque, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(deque)) {deque->front = newNode;deque->rear = newNode;} else {deque->rear->next = newNode;deque->rear = newNode;}
}// 从队头删除元素
int deleteFront(Deque* deque) {if (isEmpty(deque)) {printf("Deque is empty.\n");return -1;}int value = deque->front->data;Node* temp = deque->front;deque->front = deque->front->next;if (deque->front == NULL) {deque->rear = NULL;}free(temp);return value;
}// 从队尾删除元素
int deleteRear(Deque* deque) {if (isEmpty(deque)) {printf("Deque is empty.\n");return -1;}int value = deque->rear->data;Node* temp = deque->rear;Node* current = deque->front;while (current->next != deque->rear) {current = current->next;}deque->rear = current;deque->rear->next = NULL;free(temp);return value;
}// 获取队头元素
int getFront(Deque* deque) {if (isEmpty(deque)) {printf("Deque is empty.\n");return -1;}return deque->front->data;
}// 获取队尾元素
int getRear(Deque* deque) {if (isEmpty(deque)) {printf("Deque is empty.\n");return -1;}return deque->rear->data;
}// 打印双端队列元素
void printDeque(Deque* deque) {Node* current = deque->front;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {Deque* deque = initializeDeque();insertFront(deque, 1);  // 队头插入元素1insertFront(deque, 2);  // 队头插入元素2insertRear(deque, 3);   // 队尾插入元素3printDeque(deque);      // 输出:2 1 3deleteFront(deque);     // 从队头删除元素printDeque(deque);      // 输出:1 3deleteRear(deque);      // 从队尾删除元素printDeque(deque);      // 输出:1printf("Front element: %d\n", getFront(deque));  // 输出队头元素:1printf("Rear element: %d\n", getRear(deque));    // 输出队尾元素:1return 0;
}

知识点回顾与重要考点

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

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

相关文章

大势速影:机载激光快速建模测绘装备

实景三维模型高逼真、高真实、高精度的展示地物的几何结构、纹理色彩、空间位置等信息&#xff0c;在当前测绘应急保障、规划等领域具备极大的应用价值。但是&#xff0c;激光雷达和倾斜摄影建模技术均无法较好的满足快速建模应用需求&#xff0c;具体表现在&#xff1a;激光点…

rsync远程同步(可爱可抵漫长岁月)

文章目录 一、简介二、部署rsync主客服务器1.关闭防火墙&#xff08;真的老生常谈了 一生之敌&#xff01;&#xff09;2.建立/etc/rsyncd.conf 配置文件3.客户端配置4.发起端配置 rsyncinotify 三、拓展使用rsync来实现快速删除大量文件。 一、简介 什么是rsync&#xff1f; …

图像视频基础

参考学习资料&#xff1a;https://blog.csdn.net/qq_28258885/article/details/116192244 文章目录 图像颜色深度分辨率 视频帧率比特率帧类型消除冗余的方法时间冗余&#xff08;帧间预测&#xff09;空间冗余&#xff08;帧内预测&#xff09; 视频编码器1.分区2.预测3.转换…

HCIP-Cloud Service Solutions Architect v3.0

华为职业认证hcip解决方案架构师v3.0 新增题库200题 HCIP-Cloud Service Solutions Architect v3.0 1.关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f; A.使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 B.通过外部文件…

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

文章目录 动态网页爬取静态网页与动态网页的区别使用Selenium实现动态网页爬取Selenium 的语法及介绍Selenium简介安装和配置创建WebDriver对象页面交互操作 元素定位 等待机制页面切换和弹窗处理截图和页面信息获取关闭WebDriver对象 使用API获取动态数据未完待续.... 动态网页…

Java 泛型进阶

目录 一、什么是泛型 二、引出泛型 1、语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 4、裸类型(Raw Type) &#xff08;了解&#xff09; &#xff08;1&#xff09;说明 五、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类型数组 …

CRM的哪些功能对企业最有用?

企业如何在竞争激烈的市场环境中&#xff0c;提高销售效率&#xff0c;管理客户关系&#xff0c;实现业绩增长&#xff1f;适合的CRM客户管理系统就可以帮助很多。Zoho CRM是一款SaaS云端CRM系统&#xff0c;它能够帮助企业管理客户关系&#xff0c;提高销售效率&#xff0c;获…

2023牛客网秋招国内大厂最牛的 Java 面试八股文合集(全彩版)

秋收即将来临&#xff0c;找工作的小伙伴比比皆是&#xff0c;很对小伙伴早早的就开始储备技术&#xff0c;准备秋招面试了。 为了帮助小伙伴更好的应对面试&#xff0c;我拉来十几个大佬&#xff0c;汇总一线大厂的情况&#xff0c;给你整了一套超全的面试资料&#xff1a; 16…

测试进阶面试必问12个算法题,洞悉出题思路,拿的就是高薪!

可以明确的一点是&#xff0c;面试算法题目在难度上&#xff08;尤其是代码难度上&#xff09;会略低一些&#xff0c;倾向于考察一些基础数据结构与算法&#xff0c;对于高级算法和奇技淫巧一般不作考察。 代码题主要考察编程语言的应用是否熟练&#xff0c;基础是否扎实&…

SQL方言:传统关系型数据库下的方言对比

前言&#xff1a; 技术多元化是一个趋势&#xff0c;多语言并存&#xff0c;多数据库适配&#xff0c;多环境兼容>< 场景&#xff1a; 当从SQL Server数据库迁移到MySql数据库或者Oracle数据库&#xff0c;甚至国产化数据库&#xff0c;不同数据库之间可以自定义切换&…

基于物联网、云计算建设的智慧校园云平台源码

电子班牌作为班级文化展示交流的窗口&#xff0c;可以让更多的人看到校园信息建设与班级风格相结合&#xff0c;及时传递校园信息。学生也可以通过电子班牌看到学校近期重要事件的发布&#xff0c;也可以参与回复&#xff0c;让学生及时掌握校园和班级动态。同时&#xff0c;还…

Middleware ❀ Zookeeper功能与使用详解

文章目录 1、功能简述1.1 服务目标1.2 文件系统 - 树状结构1.3 数据节点Znode类型1.4 变更通知 - Watcher1.4.1 工作机制1.4.1.1 Client注册1.4.1.2 Server处理1.4.1.3 Client回调 1.4.2 监听特性 1.5 权限控制 - ACL1.5.1 模式 - scheme1.5.2 权限 - Permission 1.6 选举机制1…