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

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

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月17日 21:37:35

相关推荐

  • 响应式布局网站的优势和挑战

    随着移动设备的普及和互联网的快速发展,越来越多的用户选择通过手机和平板电脑访问网站。这就带来了响应式布局网站的发展和应用。响应式布局是一种灵活的设计方法,可以根据用户的设备和屏幕尺寸,自动调整和优化网站的布局和内容显示。本文将讨论响应式布局网站的优势和挑战。 首先,响应式布局网站的最大优势在于它可以…

    2025年12月24日
    000
  • 重要性及优势:响应式设计的价值

    响应式布局的重要性及优势 随着移动设备的普及和互联网的快速发展,访问网站的用户越来越多地采用移动设备,例如智能手机和平板电脑。因此,开发一个适应不同屏幕尺寸的网站变得至关重要。在这样的背景下,响应式布局应运而生。 响应式布局是一种能够根据用户设备的屏幕尺寸和分辨率自动调整和适应的网页设计和开发技术。…

    2025年12月24日 好文分享
    000
  • 深入理解粘性定位的应用和功能

    粘性定位是一种在网页设计中常用的技术,它能够使网页元素保持在页面的固定位置,即使用户滚动页面时也不会发生改变。粘性定位具有很强的功能性和实用性,在网页设计和用户体验中发挥着重要作用。本文将探讨粘性定位的功能和应用。 一、功能 固定导航栏:粘性定位可以使导航栏始终保持在页面的顶部或侧边,使用户在滚动页…

    2025年12月24日
    000
  • 解析粘性定位的作用与优势

    粘性定位的作用与优势解析 随着移动互联网的迅猛发展,用户对于网站的要求也越来越高。在网页设计中,如何提供更好的用户体验成为了一个重要的话题。而粘性定位就是一种能够提升用户体验的设计技术,它的作用与优势备受关注。 粘性定位,顾名思义,指的是在网页上固定某个元素,使其始终处于可见的位置。当用户在浏览网页…

    2025年12月24日
    000
  • CSS中绝对定位属性的解析与其在前端开发中的应用

    解析绝对定位属性 CSS 的特性及其在前端开发中的应用 一、绝对定位属性 CSS 的特性 绝对定位是 CSS 中常用的定位方式之一,它可以让元素脱离普通文档流,并通过指定的偏移量相对于包含它的父元素或根元素进行定位。绝对定位属性具有以下几个特性: 脱离文档流:绝对定位的元素脱离了普通文档流,不再占据…

    2025年12月24日 好文分享
    000
  • 前端开发中的应用与实践:使用Ajax函数

    Ajax函数在前端开发中的应用与实践 随着Web应用的快速发展,前端开发变得越来越重要。而Ajax作为一种前端开发技术,能够实现无需刷新页面的数据交互,成为了前端开发中不可或缺的工具。本文将介绍Ajax函数的基本原理,以及在前端开发中的应用与实践,并提供具体的代码示例。 Ajax函数的基本原理Aja…

    2025年12月24日
    000
  • 探索绝对定位在网页布局中的独特特点和优越性

    利用绝对定位实现网页布局的独特特点与优势 绝对定位(Absolute positioning)是一种网页布局技术,它使得元素可以根据其父元素的位置来定位。相比于其他布局方式,利用绝对定位可以实现更加灵活和精确的网页布局。在本文中,我们将探讨绝对定位的独特特点和优势,并分享一些具体的代码示例。 独特特…

    2025年12月24日
    000
  • 揭示网页设计中绝对定位的独特优势

    探索绝对定位在网页设计中的独特优势 在网页设计中,绝对定位是一种常用的布局方式。通过使用绝对定位,可以将元素精确地放置在网页的指定位置,同时还可以轻松实现一些特殊的布局效果。本文将就这些优势进行探索,并通过具体的代码示例来说明。 精确定位元素位置 绝对定位可以精确地控制元素在网页中的位置。通过指定元…

    2025年12月24日
    000
  • 深入理解CSS中绝对定位的机制以及其在网页布局中的优点

    探索绝对定位属性CSS的原理及其在网页布局中的优势 在网页设计和开发中,定位元素是一个非常重要的概念。其中,绝对定位是一种常用的定位方式,它可以让我们更精确地控制元素在页面中的位置和布局。本文将探索绝对定位属性CSS的原理,并介绍它在网页布局中的优势。同时,还将提供一些具体的代码示例。 首先,我们来…

    2025年12月24日
    000
  • 探索Web标准化的利与弊

    在当今数字化时代,Web标准化已成为设计和开发互联网应用和网站的基石。随着网络用户和互联网技术不断增长和发展,Web标准化在增强用户体验、提高开发效率以及促进跨平台互操作性方面发挥着重要作用。然而,尽管Web标准化在理念上是十分有吸引力的,但实际上在实施过程中仍面临着一些挑战。 首先,让我们来探讨W…

    2025年12月24日
    000
  • CSS高级选择器的特性与优势详细分析

    深度解析CSS高级选择器的特性与优势 简介:CSS是网页开发中必不可少的一部分,通过CSS可以为网页添加样式和布局。而选择器是CSS中非常重要的一部分,它决定了CSS规则应用到网页中的哪些元素上。在CSS中,我们熟悉的有基本选择器、层次选择器、伪类选择器等。除了这些常见的选择器,CSS还提供了一些高…

    2025年12月24日
    000
  • 元素选择器在网页设计的应用领域

    元素选择器在网页设计中的应用,需要具体代码示例 在网页设计中,元素选择器是一种非常重要的CSS选择器,它能够帮助我们对网页中的元素进行样式的控制和调整。通过灵活运用元素选择器,可以实现各种精美的网页设计效果。 一、元素选择器的基本语法和用法元素选择器是CSS选择器中最简单的一种,它通过指定HTML元…

    2025年12月24日
    000
  • 使用元素选择器实现动态效果

    元素选择器在动态效果实现中的应用 在前端开发中,动态效果的实现是非常常见的需求。元素选择器是 CSS 中的一个重要概念,它能够根据元素的属性、类名等特征来选择元素,并为其添加样式或处理事件。本文将探讨元素选择器在动态效果实现中的应用,并提供一些具体的代码示例。 一、元素选择器的基本用法元素选择器是 …

    2025年12月24日
    000
  • 响应式布局的优点及适用范围

    响应式布局的优势及其应用场景 随着移动设备的普及和多样化,人们对于网站的访问方式也发生了变化。为了适应不同屏幕尺寸和分辨率的设备,响应式布局(Responsive Design)成为了一种非常重要的设计和开发技术。本文将探讨响应式布局的优势及其在实际应用中的场景,并提供相关的代码示例。 一、响应式布…

    2025年12月24日 好文分享
    000
  • CSS中的固定定位属性的应用和案例分析

    固定定位属性在CSS中的应用及案例分析 在网页开发中,CSS的固定定位属性是一项非常常用的技术。通过设置元素的position为fixed,我们可以将元素固定在页面的某个位置,使之不受滚动影响。本文将介绍固定定位属性的基本用法,并提供一些案例分析,以帮助读者更好地理解和运用这一技术。 一、基本用法 …

    2025年12月24日
    000
  • 探究手机端CSS框架的优点与不足

    了解手机端CSS框架的优势和劣势 随着移动设备的普及和移动互联网的发展,手机成为了人们生活中必不可少的一部分。在开发手机端网页时,使用CSS框架可以帮助我们快速构建适配不同设备的界面,提高开发效率和用户体验。然而,CSS框架也存在一些劣势。本文将分析手机端CSS框架的优势和劣势。 首先,我们来看一下…

    2025年12月24日
    000
  • CSS3的新特性一览:如何应用CSS3动画效果

    CSS3的新特性一览:如何应用CSS3动画效果 引言:随着互联网的发展,CSS3逐渐取代了CSS2成为前端开发中最常用的样式语言。CSS3提供了许多新的特性,其中最受欢迎的是动画效果。通过使用CSS3动画,可以为网页添加令人惊艳的交互效果,提高用户体验。本文将介绍一些CSS3常用的动画特性,并提供相…

    2025年12月24日
    000
  • 使用css有什么优势

    使用css的优势有:1、内容与表现分离;2、网页的表现统一,容易修改;3、丰富的样式,使页面布局更加灵活;4、减少网页的代码量,增加网页的浏览速度;5、有利于网页被搜索引擎收录。 优势: (学习视频分享:css视频教程) 1、内容与表现分离 2、网页的表现统一,容易修改 立即学习“前端免费学习笔记(…

    2025年12月24日
    000
  • 简述网页设计师怎么使用好CSS3技术

    在本文中,我们将研究css3的优势,并看一下一些网页设计师是如何使用它们的。最后,我们将了解到从css3中我们能得到什么以及我们如何在我们的项目中使用它的新特性。 前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览…

    2025年12月23日 好文分享
    000
  • 在Flask应用中利用JavaScript实现动态图片更新教程

    本教程详细介绍了如何在python flask web应用中实现图片的周期性自动更新。我们将学习如何使用javascript在客户端定时刷新图片,并探讨flask后端如何配合处理图片文件,确保前端能够获取到最新的图像内容,即使文件名保持不变。 引言:动态图片更新的需求 在现代Web应用开发中,许多场…

    2025年12月23日 好文分享
    000

发表回复

登录后才能评论
关注微信