目录
双端队列的应用
双端队列的优点
双端队列的缺点
双端队列操作的算法
双端队列的语法
使用双端队列的各种方法的处理
双端队列的一般实现
示例 4
输出
将元素插入双端队列
从双端队列访问元素
更改双端队列的元素
结论
首页 后端开发 C++ 应用、优势和缺点的双端队列

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

Sep 06, 2023 pm 06:13 PM
优势 应用 双端队列

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

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< object_type > deque_name;
deque<int> deque1 = {11, 21, 31, 41, 51};
deque<int> deque2 {10, 20, 30, 40, 50};
登录后复制

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

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

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

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

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

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

双端队列的一般实现

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

示例 1

<iostream>#include <iostream>
using namespace std;
#define MAX 10

class 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 << "Overflow\n"
         << 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 << " Overflow\n " << 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 Underflow\n"
      << 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 << " Underflow\n"
      << 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 << " Underflow\n"
      << endl;
      return -1;
   }
   return arr[front];
}
int Deque::getRear() {
   if (isEmpty() || rear < 0) {
      cout << " Underflow\n"
      << 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;
}

</iostream>
登录后复制

输出

insert element at rear end 
rear element: 11
after deletion of the rear element, the new rear element: 5
insert element at front end 
front element: 8
after deletion of front element new front element: 5
登录后复制

将元素插入双端队列

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

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

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

示例 2

#include <iostream>
#include <deque>
using namespace std;
int main() {
   deque<int> 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 <iostream>
#include <deque>
using namespace std;
int main() {
   deque<int> 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: 16
Back element are here: 10
Element at index 1 present here: 7
Element at index 0 present here: 16
登录后复制

更改双端队列的元素

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

示例 4

#include <iostream>
#include <deque>
using namespace std;
int main() {
   deque<int> 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++可能的代码。

以上是应用、优势和缺点的双端队列的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在iPhone中撤消从主屏幕中删除 如何在iPhone中撤消从主屏幕中删除 Apr 17, 2024 pm 07:37 PM

从主屏幕中删除了重要内容并试图将其取回?您可以通过多种方式将应用程序图标放回屏幕。我们已经讨论了您可以遵循的所有方法,并将应用程序图标放回主屏幕如何在iPhone中撤消从主屏幕中删除正如我们之前提到的,有几种方法可以在iPhone上恢复此更改。方法1–替换应用程序库中的应用程序图标您可以直接从应用程序库将应用程序图标放置在主屏幕上。第1步–横向滑动以查找应用程序库中的所有应用程序。步骤2–找到您之前删除的应用程序图标。步骤3–只需将应用程序图标从主库拖动到主屏幕上的正确位置即可。这是将应用程序图

PHP中箭头符号的作用及实践应用 PHP中箭头符号的作用及实践应用 Mar 22, 2024 am 11:30 AM

PHP中箭头符号的作用及实践应用在PHP中,箭头符号(->)通常用于访问对象的属性和方法。对象是PHP中面向对象编程(OOP)的基本概念之一,在实际开发中,箭头符号在操作对象时发挥着重要作用。本文将介绍箭头符号的作用以及实践应用,并提供具体的代码示例来帮助读者更好地理解。一、箭头符号的作用访问对象的属性箭头符号可以用来访问对象的属性。当我们实例化一个对

从入门到精通:探索Linux tee命令的各种应用场景 从入门到精通:探索Linux tee命令的各种应用场景 Mar 20, 2024 am 10:00 AM

Linuxtee命令是一个非常有用的命令行工具,它可以在不影响已有输出的情况下,将输出写入文件或者将输出送往另一个命令。在本文中,我们将深入探索Linuxtee命令的各种应用场景,从入门到精通。1.基本用法首先,我们来看一下tee命令的基本用法。tee命令的语法如下:tee[OPTION]...[FILE]...该命令会从标准输入读取数据,并将数据

Go语言的特点与优势分析 Go语言的特点与优势分析 Apr 03, 2024 pm 10:06 PM

Go语言的特点:高并发性(goroutine)自动垃圾回收跨平台简洁性模块化Go语言的优势:高性能安全性可扩展性社区支持

使用 serverless 架构部署 PHP 应用的优势和劣势是什么? 使用 serverless 架构部署 PHP 应用的优势和劣势是什么? May 06, 2024 pm 09:15 PM

使用Serverless架构部署PHP应用程序具有以下优点:免维护、按需付费、高度可扩展、简化开发和支持多种服务。缺点包括:冷启动时间、调试困难、锁定供应商、功能限制和成本优化挑战。

探索Go语言的优势及应用场景 探索Go语言的优势及应用场景 Mar 27, 2024 pm 03:48 PM

Go语言是一种由Google开发的开源编程语言,于2007年首次发布。它被设计成一种简单易学、高效、并发性强的语言,受到越来越多开发者的青睐。本文将探索Go语言的优势,并介绍一些适合Go语言的应用场景,同时给出具体的代码示例。优势并发性强:Go语言内置支持轻量级线程——goroutine,能够很容易地实现并发编程。通过使用go关键字就可以启动goroutin

Golang 服务器的优势及效用详解 Golang 服务器的优势及效用详解 Mar 20, 2024 pm 01:51 PM

Golang是一种由Google开发的开源编程语言,它具有高效、快速、强大的特点,被广泛应用在云计算、网络编程、大数据处理等领域。作为一种强类型、静态语言,Golang在构建服务器端应用程序时具有诸多优势。本文将详细解析Golang服务器的优势及效用,并通过具体的代码示例来说明其强大之处。1.高性能Golang的编译器能够将代码编译成为本地代

做矩阵账号的优势有哪些?普通账号能做矩阵账号吗? 做矩阵账号的优势有哪些?普通账号能做矩阵账号吗? Mar 26, 2024 am 09:31 AM

在当今社交媒体日益繁荣的背景下,矩阵账号运营已经成为一种流行的营销策略。所谓矩阵账号,就是将一个品牌或个人在不同平台上的账号相互关联,形成一个网络矩阵,以实现资源共享、粉丝互动和品牌推广。本文将探讨做矩阵账号的优势,以及普通账号是否能做矩阵账号。一、做矩阵账号的优势有哪些?建立矩阵账号可以拓宽影响力,通过在不同平台发布内容,可以最大化品牌或个人的影响力。不同平台拥有独特的用户群体和传播方式,利用矩阵账号可以覆盖更广泛的目标受众,从而提升知名度和影响力。2.粉丝互动:通过创建矩阵账号,可以促进粉丝

See all articles