应用、优势和缺点的双端队列

应用、优势和缺点的双端队列

Deque或双端队列是一种顺序线性收集数据队列,提供类似于双端队列的功能。在此数据结构中,该方法不遵循先进先出(FIFO)规则进行数据处理。这种数据结构也称为双端队列,因为元素插入到队列的末尾并从前面删除。对于双端队列,我们​​只能从两端添加和删除数据。双端队列操作的时间复杂度为O(1)。有两种类型的双端队列 –

输入受限

单端输入限制。

允许从两端删除数据。

输出受限

单端输出限制。

允许向两端插入数据。

以下命令可帮助编码人员使用双端队列上的数据集池执行各种操作 –

push_back() – 从双端队列的后面插入一个元素。

push_front() – 从双端队列的前面插入一个元素。

pop_back() – 从双端队列后面删除元素。

pop_front() – 从双端队列的前面删除元素。

front() – 返回双端队列前面的元素。

back() – 返回双端队列后面的元素。

at() – 设置/返回指定索引处。

size()-返回元素的数量。

empty() – 如果双端队列为空,则返回 true。

在循环数组中我们可以使用双端队列操作。如果数组已满,那么我们可以从头开始该过程。但对于线性数组,如果数组已满,则无法插入更多数据。然后我们可以看到一个“溢出弹出窗口”。

双端队列的应用

Deque 有很多实时应用程序可供使用。

用于作业调度应用程序。

在 O(1) 时间内我们可以执行顺时针和逆时针旋转操作。

双端队列算法也存在于网络浏览器历史记录中。

用于排序中的撤消操作。

双端队列的优点

Deque 有很多优点。

我们可以从正面和背面添加和删除数据。

它们的大小是动态的。

Deque 提供了执行操作的高效时序。

此处使用了 LIFO 堆栈。

此处无法重新分配。

这是一个具有适当同步的线程安全进程。

缓存友好。

双端队列的缺点

双端队列的缺点是

Deque进程内存消耗率较高。

它存在多线程同步问题。

无法在所有平台上实现。

不适合实现排序操作。

Deque 的功能较少。

双端队列操作的算法

第 1 步 – 考虑一个大小为 n 的双端队列数组。

第 2 步 – 将两个指针设置为“front=-1”(表示 front)和“rear=0”(表示 set)。

这个过程有很多子部分。在双端队列中我们可以执行多个操作。我们在这里总结了它们。

在双端队列中从前面插入数据的算法:-

第 1 步 – 检查前面的位置。

第 2 步 – 如果“front

第 3 步 – 否则,我们需要将“front”减少 1。

第 4 步 – 将新的键元素添加到数组的前面位置。

在双端队列后面插入数据的算法:-

第 1 步 – 检查阵列是否已满。

第 2 步 – 如果已满,则应用“rear=0”。

第 3 步 – 否则,将“rear”的值增加 1。

第 4 步 – 再次将新键添加到“array[rear]”中。

从双端队列前面删除数据的算法:-

第 1 步 – 检查双端队列是否为空。

第 2 步 – 如果列表为空(“front=-1”),则为下溢条件,无法进行删除。

步骤 3 – 如果双端队列中只有一个元素。然后“front=rear=-1”。

第 4 步 – 否则,“front”位于末尾,然后设置为“front=0”。

第 5 步 – 否则,front=front+1。

从双端队列后面删除数据的算法:-

第 1 步 – 检查双端队列是否为空。

步骤 2 – 如果为空(“front=-1”),则无法执行删除。这是下溢条件。

第 3 步 – 如果双端队列只有一个数据,则“front=rear=-1”。

第 4 步 – 否则,请按照以下步骤操作。

步骤 5 – 如果后部位于前面“后部=0”。转到前面“rear = n-1”。

第 6 步 – 否则,rear=rear-1。

检查双端队列是否为空的算法:-

第 1 步 – 如果 front=-1,则双端队列为空。

检查双端队列是否已满的算法:-

步骤 1 – 如果前=0 且后= n-1

第 2 步 – 或者,front=rear+1

双端队列的语法

deque deque_name;deque deque1 = {11, 21, 31, 41, 51};deque deque2 {10, 20, 30, 40, 50};

在数据结构中,双端队列继承了堆栈和队列的一些属性。在 C++ 中,双端队列被实现为向量的向量。

使用双端队列的各种方法的处理

方法 1 – 以一般方式实现双端队列

方法 2 – 将元素插入双端队列

方法 3 – 从双端队列访问元素

方法 4 – 更改双端队列的元素

双端队列的一般实现

在此 C++ 构建代码中,我们以通用方式配置了双端队列操作。在这个例子中,我们在队列的后端插入了一个元素,整个系统就是按照这种方式执行的。

示例 1

#include using namespace std;#define MAX 10class Deque {   int arr[MAX];   int front;   int rear;   int size;   public:   Deque(int size) {      front = -1;      rear = 0;      this->size = size;   }   void insertfront(int key);   void insertrear(int key);   void deletefront();   void deleterear();   bool isFull();   bool isEmpty();   int getFront();   int getRear();};bool Deque::isFull() {   return ((front == 0 && rear == size - 1) ||      front == rear + 1);}bool Deque::isEmpty() {   return (front == -1);}void Deque::insertfront(int key) {   if (isFull()) {      cout << "Overflown"         << endl;      return;  }  if (front == -1) {     front = 0;     rear = 0;  }  else if (front == 0)     front = size - 1;   else     front = front - 1;   arr[front] = key;}void Deque ::insertrear(int key) {  if (isFull()) {    cout << " Overflown " << endl;    return;  }  if (front == -1) {    front = 0;    rear = 0;  }  else if (rear == size - 1)    rear = 0;  else    rear = rear + 1;  arr[rear] = key;}void Deque ::deletefront() {   if (isEmpty()) {      cout << "Queue Underflown"      << endl;      return;   }   if (front == rear) {      front = -1;      rear = -1;   } else if (front == size - 1)      front = 0;   else      front = front + 1;}void Deque::deleterear() {   if (isEmpty()) {      cout << " Underflown"      << endl;    return;   }   if (front == rear) {       front = -1;      rear = -1;   } else if (rear == 0)      rear = size - 1;   else      rear = rear - 1;}int Deque::getFront() {   if (isEmpty()) {      cout << " Underflown"      << endl;      return -1;   }   return arr[front];}int Deque::getRear() {   if (isEmpty() || rear < 0) {      cout << " Underflown"      << endl;      return -1;   }   return arr[rear];}int main() {   Deque dq(4);   cout << "insert element at rear end n";   dq.insertrear(5);   dq.insertrear(11);   cout << "rear element: "   << dq.getRear() << endl;   dq.deleterear();   cout << "after deletion of the rear element, the new rear element: " << dq.getRear() << endl;   cout << "insert element at front end n";   dq.insertfront(8);   cout << "front element: " << dq.getFront() << endl;   dq.deletefront();   cout << "after deletion of front element new front element: " << dq.getFront() << endl;}

输出

insert element at rear end rear element: 11after deletion of the rear element, the new rear element: 5insert element at front end front element: 8after deletion of front element new front element: 5

将元素插入双端队列

在此代码中,我们尝试创建 C++ 代码以将元素插入双端队列。有两种方法可以执行此操作。

push_back() – 在数组末尾插入元素。

push_front() – 在数组的开头插入元素。

示例 2

#include #include using namespace std;int main() {   deque nums {16, 7};   cout << "Initial Deque As We Give: ";   for (const int& num : nums) {      cout << num << ", ";   }   nums.push_back(2001);   nums.push_front(1997);   cout << "nFinal Deque Is Here: ";   for (const int& num : nums) {      cout << num << ", ";   }   return 0;}

输出

Initial Deque As We Give: 16, 7, Final Deque Is Here: 1997, 16, 7, 2001,

从双端队列访问元素

我们可以使用两种方法访问双端队列中的元素。

front() – 在前面我们可以获得返回值。

back() – 返回后面的数据。

at() – 从指定索引返回。

#include #include using namespace std;int main() {   deque nums {16, 07, 10};   cout << "Front element are here: " << nums.front() << endl;   cout << "Back element are here: " << nums.back() << endl;   cout << "Element at index 1 present here: " << nums.at(1) << endl;   cout << "Element at index 0 present here: " << nums[0];   return 0;}

输出

Front element are here: 16Back element are here: 10Element at index 1 present here: 7Element at index 0 present here: 16

更改双端队列的元素

在此代码中,我们可以使用 at() 方法来替换或更改该特定双端队列的元素。

示例 4

#include #include using namespace std;int main() {   deque nums = {07,16,10,1997,2001};   cout << "Initial Deque: ";   for (const int& num : nums) {      cout << num << ", ";   }   nums.at(0) = 2022;   nums.at(1) = 10-05;   cout << "nUpdated Deque: ";   for (const int& num : nums) {      cout << num << ", ";   }   return 0;}

输出

Initial Deque: 7, 16, 10, 1997, 2001, Updated Deque: 2022, 5, 10, 1997, 2001,

结论

通过这篇文章,我们了解了双端队列,它的操作方法、应用、优缺点以及算法和使用C++可能的代码。

以上就是应用、优势和缺点的双端队列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:37:08
下一篇 2025年12月8日 21:41:13

相关推荐

  • API驱动应用开发:Go与Rails在SOA中的实践与权衡

    本文探讨了从传统ruby on rails单体应用向api驱动的服务导向架构(soa)转型的关键考量。我们将深入分析go作为api服务器与rails作为应用服务器的协作模式,阐明在此架构下数据流转、orm与控制器的新角色。文章还详细列举了soa的诸多优势,并讨论了语言选择(特别是go)的潜力与挑战,…

    2025年12月16日
    000
  • 在Java应用中集成Python机器学习模型:Jython实践指南

    本教程详细阐述了如何在Java应用中无缝集成并调用Python机器学习模型。通过使用Jython,我们可以在Java虚拟机内部创建Python解释器,直接执行Python代码,并从Java中获取Python对象及调用其方法,从而实现Python模型与Java业务逻辑的紧密结合,为混合语言开发提供了高…

    2025年12月14日
    000
  • python中deque双端队列怎么用?

    deque是Python中高效处理双端操作的队列结构,适用于频繁在两端增删元素的场景。它支持append、appendleft、pop、popleft等基本操作,时间复杂度均为O(1),性能优于list。通过maxlen参数可实现固定长度的滑动窗口,超出时自动从对端移除元素。deque不支持线程安全…

    2025年12月14日
    000
  • 深入了解numpy中的随机数生成方法和应用

    探索 NumPy 生成随机数的方法及应用 引言:随机数在计算机科学和统计学中有着广泛的应用,例如模拟实验、数据生成和特征选择等。在Python中,NumPy(Numerical Python)库是一个强大的数值计算库,提供了许多用于生成随机数的函数。本文将对NumPy中的随机数生成方法进行探索,并给…

    2025年12月13日
    000
  • Python开发建议:学习并应用最佳的开发实践

    Python是一种简单易学的编程语言,但要成为一名优秀的Python开发人员,除了掌握语法和基本知识外,还需要学习并应用最佳的开发实践。在本文中,我们将探讨一些Python开发的最佳实践,以帮助开发人员写出高质量、可维护和高效的Python代码。 第一项建议是熟练掌握Python语言特性。Pytho…

    2025年12月13日
    000
  • Python中的迭代器和生成器的优劣势和适用场景是什么?

    Python中的迭代器和生成器的优劣势和适用场景是什么? 迭代器和生成器是Python中常用的编程概念,它们可以帮助我们更有效地处理大量数据,提高程序的性能和可读性。这篇文章将详细介绍迭代器和生成器的优劣势,并给出一些适用场景的具体代码示例。 迭代器的优势和适用场景迭代器是一个可以遍历数据集合的对象…

    2025年12月13日
    000
  • 使用Python Web框架开发高性能应用的关键技巧

    使用Python Web框架开发高性能应用的关键技巧,需要具体代码示例 简介:Python是一种简单易学且功能强大的编程语言,被广泛应用于Web开发领域。为了提升Python Web应用的性能,开发者需要掌握一些关键技巧。本文将重点介绍使用Python Web框架开发高性能应用的关键技巧,并提供具体…

    2025年12月13日
    000
  • Laravel中优雅地处理“返回”按钮与表单验证冲突

    本教程旨在解决laravel表单中“返回”按钮意外触发验证的问题。核心方案是将作为提交按钮的“返回”操作替换为标准的超链接,从而避免不必要的表单提交和验证。同时,优化后端控制器逻辑,确保“返回”操作平滑导航,而“提交”操作依然能通过form request进行严格的验证。 在Laravel应用开发中…

    2025年12月13日
    000
  • Laravel数组输入验证:在Blade视图中精准显示错误信息

    本文旨在解决Laravel中处理数组形式输入(如多语言字段)时,如何通过Form Request进行有效验证,并在Blade视图中精准地为每个数组元素显示其专属的验证错误信息及应用`is-invalid`样式。我们将深入探讨Blade `@error`指令与动态错误键的正确使用方式,并提供完整的代码…

    2025年12月13日
    000
  • jqGrid 动态数据刷新教程:解决数据不更新问题

    本教程旨在解决 jqgrid 在动态数据加载时无法正确刷新的常见问题。当 jqgrid 实例被重复初始化时,会导致数据不更新。文章将详细介绍两种核心解决方案:一是通过销毁并重建网格来确保每次加载都是全新状态;二是在网格已初始化后,利用 `setgridparam` 方法高效更新数据并触发刷新。通过实…

    2025年12月12日
    000
  • Symfony Process 组件中实现输出重定向的现代方法

    本文探讨了在symfony 5.3+版本中,如何使用process组件安全有效地实现外部命令的输出重定向。针对新版process构造函数对参数数组的严格要求,我们介绍了`process::fromshellcommandline`方法结合环境变量来解决传统shell重定向符被转义的问题,确保命令输出…

    2025年12月12日
    000
  • 深入理解 Blade 模板中 PHP 变量的访问与输出

    本文旨在深入探讨 Laravel Blade 模板引擎中访问 PHP 变量的关键机制。我们将详细解析 {{ }} 用于安全输出和 {!! !!} 用于原始 HTML 输出的区别与应用场景,并指导读者如何在 HTML 属性、文本内容及 JavaScript 环境中正确使用变量,同时明确 PHP 对象属…

    2025年12月12日
    000
  • Datepicker日期选择器:禁用过往日期与日期格式化指南

    本教程详细介绍了如何使用流行的Datepicker库实现禁用过往日期功能,确保用户只能选择当前或未来的日期,并指导如何正确配置日期显示格式。文章将通过具体代码示例,帮助开发者避免常见问题,高效集成日期选择器。 引言 在web应用开发中,日期选择器(datepicker)是用户界面中不可或缺的组件,尤…

    2025年12月12日
    000
  • Binance如何下载安装?Binance官方安卓iOS版方法

    本文介绍 binance 应用的下载安装方法。binance 是一家大型的加密货币交易平台,支持买卖与管理多种数字资产。本文提供官方app下载链接,点击本文提供的下载链接即可下载。 官方下载链接 • Binance 官方下载页(含 iOS / Android / 桌面): • Google Play…

    2025年12月11日
    000
  • 跨浏览器设备识别:构建可靠的客户端通信方案

    在HTML5 Web应用开发中,实现客户端间的直接通信是一个常见的需求。然而,当需要在同一设备上运行的不同浏览器之间建立连接时,传统的识别方法,如IP地址、session、cookies等,往往无法满足需求。这是因为这些方法要么受到网络环境的限制,要么与特定的浏览器实例绑定。因此,我们需要一种更可靠…

    2025年12月10日
    100
  • 第三方 PHP 函数的用途和应用

    第三方 php 函数库提供额外的功能和便利程序,弥补了核心 php 的不足,包括数据处理、文本处理、图像处理、网络编程和文件处理。使用 composer 安装第三方函数库,然后通过 php namespace 语句引入。例如,使用 guzzlehttp 函数库发起 http 请求,该库简化了 htt…

    2025年12月9日
    000
  • ouyi交易所怎么下载 ouyi欧易交易所官方最新版APP下载v145.0版

    欧易(okx)交易所的官方app下载其实很简单,关键是要认准正确渠道,避免下到假冒软件。现在最新版本已经更新到v6.145.0,主要功能和安全性都有提升。下面直接告诉你怎么安全、快速地把app装上。 确认官网地址,避免钓鱼网站 打开手机或电脑浏览器,手动点击欧易OKX的唯一官方网站:。这个网址一定要…

    2025年12月9日
    000
  • 欧易OKX官方安装包获取_欧意App官方发布渠道2025

    要获取欧易okx的官方安装包,最核心的原则是认准官方网站,避免通过不明链接下载,以防遭遇钓鱼网站或植入恶意软件。2025年,okx作为全球领先的数字资产交易平台,其官方app(又称欧意app)的发布渠道稳定且安全。 Binance币安 欧易OKX ️ Huobi火币️ 1. 官方网站是首选渠道 访问…

    2025年12月9日
    000
  • 币安交易所APP下载_Binance官方下载地址与版本介绍

    想下载币安(binance)官方app,关键是要找到正确、安全的渠道,避免下载到假冒应用造成资产损失。最稳妥的方式是直接访问币安官网,这是确保你拿到正版软件的核心。 Binance币安 欧易OKX ️ Huobi火币️ 如何安全下载币安官方APP 下载的第一步永远是确认网址。请在手机浏览器中输入币安…

    2025年12月9日
    000
  • 币an交易所 v3.65 官方下载_币安Binancev3.65版本详细指南与注册说明

    想下载币安(binance)v3.65版本并完成注册?其实整个过程很简单,只要认准官方渠道,按步骤操作就行。重点是确保安全,避免下载到假冒的应用。下面把下载和注册的关键点说清楚。 Binance币安 欧易OKX ️ Huobi火币️ 如何安全下载币安App官方版本 获取币安App最安全的方式是直接访…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信