首页 > 其他分享 >数据结构之队列(双向队列)

数据结构之队列(双向队列)

时间:2023-10-14 09:33:04浏览次数:46  
标签:deque 队列 items 元素 queue 双向 数据结构

概念

双向队列(Double-ends Queues简称Dequeue)是一种前后2端都可以添加数据(入队)、移除(出队)数据的有序线性表。

特点

双向队列(Deque,全名Double Ended Queue)是一种具有两个指针的线性表,允许从两端都可以进行插入和删除操作即双向队列可以在任意一端进行元素的插入和删除操作,而单向队列只能在一端进行操作。

双向队列支持四种基本操作:

  • push_front(x):将元素x添加到队列头部。
  • push_back(x):将元素x添加到队列尾部。
  • pop_front():移除队列头部的元素,并返回该元素的值。
  • pop_back():移除队列尾部的元素,并返回该元素的值。

 

双向队列可以看作是一个特殊的队列,它兼具了栈和队列的特点。

栈是一种后进先出(LIFO)的数据结构,只允许在一端进行插入和删除操作;而队列是一种先进先出(FIFO)的数据结构,只允许在一端插入,在另一端删除。而双向队列则可以同时实现这两种功能,既可用于队列,也可用于栈,所以称为“双向”队列。

 

通常我们使用一个双向链表来实现双向队列,因为插入和删除操作时间复杂度都是O(1),但是如果要删除中间某个节点则需要O(n)的时间,不过很少需要删除中间的节点,所以在大多数情况下效率是很高的。

在Java中,Java 6引入了一个新的双向队列接口Deque和LinkedList实现类。

 

Python

在Python中,可以通过collections模块的deque类来实现双向队列(deque)。deque是一种双向队列,即可以从两端进行插入和删除操作。

from collections import deque

# 创建一个空的双向队列
d = deque()

# 在右侧插入元素
d.append(1)  # 默认入队是队尾入队
print(d)  # 输出:deque([1])

# 在左侧插入元素
d.appendleft(2)
print(d)  # 输出:deque([2, 1])

# 弹出最右边的元素
print(d.pop())  # 输出:1   默认入队是队尾出队
print(d)  # 输出:deque([2])

# 弹出最左边的元素
print(d.popleft())  # 输出:2
print(d)  # 输出:deque([])

# 判断双向队列是否为空
print(d)  # 输出:True

# 获取双向队列的长度
print(len(d))  # 输出:0

 Java语言

在Java语言中,可以通过使用LinkedList类来实现双向队列。LinkedList类实现了List接口,并且还实现了Deque接口,Deque接口继承自Queue接口,因此LinkedList可以作为双向队列使用。

对于双向队列,我们可以在队列的两端进行插入和删除操作。LinkedList提供了一系列方法来支持双向队列的操作,包括在队头和队尾插入元素、获取队头和队尾元素、移除队头和队尾元素等。

import java.util.LinkedList;

public class MyDequeueDemo {


    public static void main(String[] args) {
        LinkedList<Integer> deque = new LinkedList<>();

        // 在队尾添加元素
        deque.addLast(1);
        deque.addLast(2);
        deque.addLast(3);

        // 在队头添加元素
        deque.addFirst(0);

        // 获取队头和队尾元素
        System.out.println("队头元素:" + deque.getFirst()); // 输出:0
        System.out.println("队尾元素:" + deque.getLast()); // 输出:3

        // 删除队头和队尾元素
        deque.removeFirst();
        deque.removeLast();

        // 遍历队列
        System.out.println("遍历队列:");
        for (Integer num : deque) {
            System.out.print(num + " "); // 输出:1 2
        }
    }
}

输出:

队头元素:0
队尾元素:3
遍历队列:
1 2 

  

Javascript

 1 class Deque {
 2     constructor() {
 3         this.items = []; // 存储元素
 4     }
 5 
 6     enqueue(val) {
 7         // 向队列尾部插入元素
 8         this.items.push(val);
 9     }
10 
11     dequeue() {
12         // 删除队列头部元素,并返回删除的元素
13         return this.items.shift();
14     }
15 
16     addFront(val) {
17         // 向队列头部插入元素
18         this.items.unshift(val);
19     }
20 
21     removeEnd() {
22         // 删除队列尾部元素,并返回删除的元素
23         return this.items.pop();
24     }
25 
26     isEmpty() {
27         // 判断队列是否为空
28         return this.items.length === 0;
29     }
30 
31     size() {
32         // 返回队列长度
33         return this.items.length;
34     }
35 }
36 
37 queue= new Deque();
38 queue.enqueue(1)
39 queue.enqueue(2)
40 queue.enqueue(3)
41 console.log(queue)
42 console.log(queue.dequeue())
43 console.log(queue)
44 queue.addFront(4)
45 console.log(queue)
46 queue.removeEnd()
47 console.log(queue)
48 console.log(queue.isEmpty())
49 console.log(queue.size())

输出:

Deque { items: [ 1, 2, 3 ] }
1
Deque { items: [ 2, 3 ] }
Deque { items: [ 4, 2, 3 ] }
Deque { items: [ 4, 2 ] }
false
2

  

标签:deque,队列,items,元素,queue,双向,数据结构
From: https://www.cnblogs.com/allenxx/p/17763668.html

相关文章

  • 14.4 Socket 双向数据通信
    所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互,此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包,这样一旦套接字被建立则两者都可以异步发送消息,本章将实现简单的双向交互功能。首先我们需要封装两个函数,这里RecvFunction函数......
  • 1.1数据结构的基本概念
    知识总览1.1.1基本概念和术语什么事数据?数据:数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号集合。数据是计算机程序加工的原料数据元素、数据项数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元......
  • 数据结构
    目录二、数据结构2.1链表2.1.1单链表2.1.2双链表2.2栈2.3队列2.4单调栈2.5单调队列2.6KMP算法2.7Trie树2.8并查集2.9手写堆2.10哈希2.10.1整数哈希2.10.1.1拉链法2.10.1.2开放寻址法2.10.2字符串哈希(解决字符串......
  • 数据结构——左偏树/可并堆学习笔记
    引入作为树形数据结构的一员——堆,对于取极值拥有着优秀的复杂度,但是,合并两个堆却成为了一个问题。除了朴素算法外,还有什么算法可以合并两个堆呢?正文那么,可并堆是个啥呢?简单来说,它是一个支持合并操作的二叉堆(好像是废话)。首先,简单介绍一下二叉堆的性质,学过的读者可自行跳过。......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(3)队列管理
    4.队列管理队列,在一些系统中被称为消息队列,可以理解为信息中转站。是任务和任务,任务和中断之间可以互相读和写的一个共享空间。4.2队列的特征存储数据队列本质上是一个先进先出的缓冲区(FIFO),所以可以存储一定容量的数据。有两种方式可以实现FIFO队列:1.将发送给队列的数据复......
  • Redisson使用延时队列
    延时队列在开发中,有时需要使用延时队列。比如,订单15分钟内未支付自动取消。jdk延时队列如果使用jdk自带的延时队列,那么服务器挂了或者重启时,延时队列里的数据就会失效,可用性比较差。Redisson延时队列可以使用Redisson的延时队列。Redisson的配置,详情见:https://blog.csdn.n......
  • 王道408---DS---线性表、栈、队列与数组
    错题2.21、题目中提到在第i个位置一般是指在下表为i的位置2、线性表元素的序号是从1开始,而在第n+1个位置插入相当于在表尾追加。静态链表树的双亲表示法就是使用了这种思想吧卡特兰数\[\text{}\frac1{n+1}C_{2n}^{n}\]栈的数学性质:n个不同元素进栈,出栈元素不同排列的个......
  • golang之异步队列Asynq
    Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Dockerimage,还可以和Prometheus集成dockerrun--rm--nameasynqmon......
  • TMS刷新后Buffer队列被清空
    前言。。。。。少叙。。。症状按SAP标准配置了传输请求,导入传输请求(addtobuffer),这时在buffer/SID下能看到加入的TR请求但在STMS刷新后,buffer/SID里的文件被刷新,信息显示为 Troubleshooting 。。。。。(凭老司机猜测,你信吗)解决方案测试10有8-9是在同一个传输系统......
  • 数据结构之队列(循环队列)
    循环队列又称为环形队列,有如下4个特点:在循环队列的定义中规定了两个索引指针:front和rear。front指向第一个有效元素的位置,而rear可以理解为用来记录队尾元素的下一个位置。当队列为空时,front==rear;当队列满时,(rear+1)%n=front.这样可以让队列看起来像一个环状......