【数据结构与算法】双端队列及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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值