Python实现的数据结构与算法之双端队列详解

Python实现的数据结构与算法之双端队列详解

什么是双端队列?

双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。

双端队列的操作

  • add_front(item):在队头插入一个元素;
  • add_rear(item):在队尾插入一个元素;
  • remove_front():在队头删除一个元素;
  • remove_rear():在队尾删除一个元素;
  • is_empty():判断队列是否为空;
  • size():返回队列中元素的个数。

双端队列的实现

双端队列可以通过列表来实现,但是每次在队头插入或删除操作时,需要对列表进行移动,因此效率较低。可以使用collections中的双端队列Deque来实现。

from collections import deque

deque = deque()

deque.appendleft(item)  # 添加左元素
deque.append(item)  # 添加右元素
deque.popleft()  # 删除左元素
deque.pop()  # 删除右元素
deque.clear()  # 清空双端队列
deque.count(item)  # 返回元素出现次数
deque.extend(iterable)  # 从右侧加入多个元素
deque.extendleft(iterable)  # 从左侧加入多个元素
deque.index(item, start=0, end=None)  # 返回第一个元素所在位置的索引
deque.remove(item)  # 删除第一个出现的元素
deque.reverse()  # 反转双端队列
deque.rotate(n=1)  # 将双端队列右移n个索引位置,第一个元素移到最后

示例说明

示例一:使用双端队列实现回文字符串判断

回文字符串是指正反读都相同的字符串,例如"level"和"noon"。使用双端队列可以很方便地判断一个字符串是否为回文字符串。

from collections import deque

def palchecker(aString):
    chardeque = deque()

    for ch in aString:
        chardeque.appendleft(ch)

    stillEqual = True

    while len(chardeque) > 1 and stillEqual:
        first = chardeque.popleft()
        last = chardeque.pop()
        if first != last:
            stillEqual = False

    return stillEqual

print(palchecker("level"))
print(palchecker("hello"))

在本例中,通过双端队列先把字符串的每个字符从左到右依次插入队列头部。然后每次从队头取出第一个字符和队尾取出最后一个字符进行比较,如果不相等则判断不是回文字符串,否则继续循环比较。最后如果整个字符串都没有出现不相等的情况,则判断为回文字符串。

示例二:使用双端队列实现迷宫求解

使用双端队列也可以实现迷宫的求解,具体实现方法是先把起点插入队尾,然后依次从队首取出一个路径,把它的下一步路径依次插入队尾,直到到达终点。

from collections import deque

def search(maze, start, end):
    queue = deque()
    queue.append(start)
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 定义方向,顺序不能变

    while len(queue) > 0:
        pos = queue.popleft()

        for direction in directions:
            next_pos = (pos[0]+direction[0], pos[1]+direction[1])
            if next_pos == end:
                print("到达终点")
                return True

            if maze[next_pos[0]][next_pos[1]] == 0:
                queue.append(next_pos)
                maze[next_pos[0]][next_pos[1]] = -1

    print("无法到达终点")
    return False

在本例中,使用了一个二维数组来表示迷宫,0表示该位置可以通过,1表示该位置不可以通过,-1表示该位置已经走过。先把起点插入队尾,然后依次从队首取出一个位置,再分别从其四个方向进行搜索,如果下一步能够到达终点,则说明迷宫已经被解开,否则把下一步路径插入队尾继续搜索,直到队列为空。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现的数据结构与算法之双端队列详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现链表逆序并输出

    下面是C语言数据结构实现链表逆序并输出的完整攻略。 1. 题目分析 本题目要求实现对链表的逆序,并依次输出各节点的值。而链表的逆序可以通过改变各节点之间的连接方式来实现。 2. 思路分析 创建一个指针,指向原链表的头结点。 遍历链表,将每个节点的next指针指向它前面的节点,从而实现链表的逆序。 遍历逆序后的链表,从头结点开始,依次输出每个节点的值。 3. …

    数据结构 2023年5月17日
    00
  • Java数据结构之循环队列简单定义与用法示例

    Java数据结构之循环队列简单定义与用法示例 什么是循环队列? 循环队列是一种数据结构,它具有先进先出(FIFO)的特点,即最先进队列的元素总是被最先取出。不同于普通队列,循环队列的尾指针指向数组的头部,因此可以实现循环利用数组空间,提高存储空间的利用率,避免因队列的操作大量移动数组元素而导致的时间浪费。 循环队列的基本操作 循环队列的基本操作包括:入队、出…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘二 线性结构

    C#数据结构与算法揭秘二 线性结构 线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。 线性表 线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。 线性表可以分为顺序表和链表两种。 顺序表(Sequence List):是把线性表的元素按照顺序存储在…

    数据结构 2023年5月17日
    00
  • C语言数据结构实例讲解单链表的实现

    C语言数据结构实例讲解单链表的实现 单链表是一种线性的数据结构,它由一系列节点组成,每个节点都包含一个数据域和一个指向下一个节点的指针域。单链表常用于需要频繁插入删除元素的场景中。 单链表的数据结构设计 在C语言中,我们可以使用结构体来定义单链表的节点: typedef struct node { int data; // 数据域 struct node* …

    数据结构 2023年5月17日
    00
  • C语言全面讲解顺序表使用操作

    C语言全面讲解顺序表使用操作 什么是顺序表 顺序表(Sequential List)是一种常见的数据结构,它由一组连续的存储单元组成,并且支持随机访问。通常我们使用数组来实现顺序表。 顺序表的基本操作 初始化 在使用顺序表之前,需要先进行初始化。顺序表的初始化包括两个步骤:指定顺序表的大小,申请内存空间。具体代码如下: #define MAXSIZE 100…

    数据结构 2023年5月17日
    00
  • c语言实现单链表算法示例分享

    下面是详细的攻略。 C语言实现单链表算法示例分享 什么是单链表 单链表是一种数据结构,它由一个个节点组成,每个节点包含两个部分:一个是数据部分,另一个是指针部分,指针部分指向下一个节点的位置。单链表的节点是动态分配的,可以随时插入、删除,是一种非常灵活的数据结构。 为什么要使用单链表 在进行一些操作时,数组或者普通的指针会遇到很多麻烦。比如在删除数组元素时,…

    数据结构 2023年5月17日
    00
  • C#数据结构揭秘一

    C#数据结构揭秘一攻略 C#数据结构是每个C#程序员必须熟练掌握的技能之一。本攻略将介绍常见的C#数据结构,包括数组、列表、栈、队列、散列表和字典。我们将会深入了解它们的特点、使用场景和使用方法,并附带代码示例加深理解。 数组 数组是存储单一类型元素的固定大小的集合结构。在C#中,可以使用以下方式声明和初始化一个数组: int[] nums1 = new i…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部