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日

相关文章

  • C#常用数据结构和算法总结

    C#常用数据结构和算法总结 数据结构 数组(Array) 数组是一种线性数据结构,它可以在内存中连续地存储相同类型的数据。可以使用索引访问数组中的元素。数组的元素可以是任意类型。 在 C# 中,定义一个数组需要指定数组的类型和数组的大小。例如,定义一个包含 5 个整数的数组: int[] arr = new int[5]; 链表(LinkedList) 链表…

    数据结构 2023年5月17日
    00
  • C语言深入浅出解析二叉树

    C语言深入浅出解析二叉树攻略 什么是二叉树 二叉树是一种树形数据结构,其每个节点最多只有两个子节点,分别称为其左子节点和右子节点。一般采用链式存储方式来实现二叉树,也可以使用数组来存储。 二叉树的遍历 二叉树的遍历分为三种方式:前序遍历,中序遍历和后序遍历。 前序遍历 前序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。可以使用递归或栈来实现。 v…

    数据结构 2023年5月17日
    00
  • Java常见基础数据结构

    Java常见基础数据结构攻略 Java是一种面向对象的编程语言,拥有丰富的数据结构,大多数基础数据结构都包含在Java API中。在本文中,我们将讨论Java中常见的基础数据结构,包括数组、链表、栈、队列、集合和映射。我们将探讨每种数据结构的定义、用法和基本操作,并提供两个示例说明。 数组 数组是Java中最基本的数据结构之一。它是一个有序的集合,可以包含任…

    数据结构 2023年5月17日
    00
  • C语言数据结构之简易计算器

    C语言数据结构之简易计算器攻略 简介 这是一个基于C语言的简易计算器,可以实现加、减、乘、除四个基本运算。 实现步骤 首先,需要声明四个变量,分别表示运算符、被加数、被减数、被乘数和被除数。 char op; double n1, n2, result; 然后,需要通过scanf()函数获取用户输入的运算符和数字。 printf(“请输入运算符和数字:\n”…

    数据结构 2023年5月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之哈希算法实现

    Java 数据结构与算法系列精讲之哈希算法实现 什么是哈希算法? 哈希算法是一种能将任意长度的消息压缩到某一固定长度的消息摘要的算法。 通过哈希算法,我们可以将一个任意的大数据量压缩成一段固定长度的数据,这个数据的长度通常比较小,相对于原数据的大小来说,要小得多。哈希算法的压缩特性使得它经常用来进行信息摘要、数据校验、唯一识别等功能,可以很大程度上提高数据的…

    数据结构 2023年5月17日
    00
  • Java数据结构之顺序表的实现

    下面是“Java数据结构之顺序表的实现”的完整攻略: 标题:Java数据结构之顺序表的实现 一、什么是顺序表 顺序表是一种线性表结构,其数据元素在物理位置上是连续的,通过下标访问,具有随机访问的优点。 二、顺序表的实现 使用Java语言实现顺序表,需要定义以下三个类: 1. SeqList类 构造顺序表的数据结构,并定义了一些基本操作,如插入、删除、修改等。…

    数据结构 2023年5月17日
    00
  • 「学习笔记」二分图

    「学习笔记」二分图 点击查看目录 目录 「学习笔记」二分图 知识点 定义及判定 二分图最大匹配 二分图最小点覆盖 二分图最大独立集 例题 P7368 [USACO05NOV]Asteroids G 思路 P2319 [HNOI2006]超级英雄 思路 Way Selection 题意 思路 文理分班 题意 思路 放置机器人 题意 思路 猫和狗 题意 思路 知…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部