【数据结构与算法】双端队列及Python实现

1 双端队列抽象数据类型及Python实现

  • 定义: 双端队列Deque是一种有次序的数据集,跟队列相似,其两端可以称作 “ 首 ”“ 尾 ” 端,但deque 中数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。某种意义上说,双端队列集成了栈和队列的能力

  • 特性: 双端队列并不具有内在的LIFO (Last in first out) 或者FIFO (First in first out) 特性

在这里插入图片描述


1.1 抽象数据类型Deque

  • Deque() :创建一个空双端队列
  • addFront(item):将item 加入队首
  • addRear(item):将item 加入队尾
  • removeFront():从队首移除数据项,返回值为移除的数据项
  • removeRear() :从队尾移除数据项,返回值为移除的数据项
  • isEmpty() :返回deque 是否为空
  • size() :返回deque

【操作样例】

Deque OperationDeque ContentsReturn value
d.isEmpty()[]True
d.addRear(4)[4]
d.addRear(‘dog’)[‘dog’,4,]
d.addFront(‘cat’)[‘dog’,4,‘cat’]
d.addFront(True)[‘dog’,4,‘cat’,True]
d.size()[‘dog’,4,‘cat’,True]4
d.isEmpty()[‘dog’,4,‘cat’,True]False
d.addRear(8.4)[8.4,‘dog’,4,‘cat’,True]
d.removeRear()[‘dog’,4,‘cat’,True]8.4
d.removeFront()[‘dog’,4,‘cat’]True

1.2 Python实现ADT Deque

class Deque():
    """
    List下标0作为deque的尾端
    List下标-1作为deque的首端
    """
    def __init__(self):
        self.items =[]

    def isEmpty(self):
        return self.items == []

    def addRear(self, item):
        """操作复杂度O(n)"""
        self.items.insert(0, item)

    def addFront(self, item):
        """操作复杂度O(1)"""
        self.items.append(item)

    def removeRear(self):
        """操作复杂度O(n)"""
        return self.items.pop(0)

    def removeFront(self):
        """操作复杂度O(1)"""
        return self.items.pop()

    def size(self):
        return len(self.items)

2 双端队列的应用

2.1 回文词判定算法

“回文词”指正读和反读都一样的词

如:	radar 、madam 、toot
		上海自来水来自海上 
		山东落花生花落东山

算法:

用双端队列很容易解决“回文词”问题,先将需要判定的词从队尾加入deque,再从两端同时移除字符判定是否相同,直到deque 中剩下0 个或1个字符。

在这里插入图片描述

【代码】

class Deque():...

def palChecker(aString):
    charDeque = Deque()

    for ch in aString:
        charDeque.addRear(ch)

    stillEqual = True

    while charDeque.size() > 1 and stillEqual:
        first = charDeque.removeFront()
        last = charDeque.removeRear()
        if first != last:
            stillEqual = False

    return stillEqual


print(palChecker('上海自来水来自海上'))		# True
print(palChecker('abcdba'))					# False

版权声明:本文为CharlieTang123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。