Deque

Deque(双端队列):

  • 特点:有序集合,有两个端部, 首部和尾部,可以在前面或后面添加新项,也可以在任一端移除现有项。
  • Deque抽象数据类型
    Deque()创建一个空的新deque。它不需要参数,返回空的deque。
    addFront(item)将一个新项添加到deque的首部。它需要item参数并不返回任何内容。
    addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
    removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
    removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
    isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
    size() 返回 deque 中的项数。它不需要参数,并返回一个整数。


    image.png
# -*- utf8 -*-
# Deque.py


'''
Deque(双端队列):
特点:有序集合,有两个端部, 首部和尾部,可以在前面或后面添加新项,也可以在任一端移除现有项。
Deque抽象数据类型
Deque()创建一个空的新deque。它不需要参数,返回空的deque。
addFront(item)将一个新项添加到deque的首部。它需要item参数并不返回任何内容。
addRear(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
removeFront() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
removeRear() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
size() 返回 deque 中的项数。它不需要参数,并返回一个整数。
'''

'''
用Python实现一个Deque
底层同样使用列表
假定deque的尾部在列表中的位置为0
在removeFront中,我们使用pop方法从列表中删除最后一个元素。
但是,在removeRear中,pop(0)方法必须删除列表的第一个元素。因为deque的末尾是列表的开头,开头是列表的结尾。
所以deque从前面添加(列表的末尾)是O(1),在后面添加(列表的前面)是O(n)
'''

class Deque:
    def __init__(self):
        self.items = []

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

    def addFront(self, item):
        self.items.append(item)

    def addRear(self, item):
        self.items.insert(0, item)

    def removeFront(self):
        return self.items.pop()

    def removeRear(self):
        return self.items.pop(0)

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


image.png
'''

Deque的实际应用:回文检查
规则:对称然后首尾相同的字符串就是回文例如 radar toot madam
大概思路:把字符串从左到右每个字符添加到deque的尾部,全部添加后,再利用deque的双重功能,
把deque的前后两边的第一个字符移除并且判断是否相同,如果相同就继续取剩下的前后两边的字符继续判断,
直到不相同即不是回文,或者deque大小为1或者为0,即回文。
'''

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("lsdkjfskf"))
print(palchecker("radar"))

# False
# True
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 翻译: 严北,公众号:devintest,转载注明出处:https://www.jianshu.com/p/4ca...
    严北阅读 7,826评论 0 2
  • 本系列博客习题来自《算法(第四版)》,算是本人的读书笔记,如果有人在读这本书的,欢迎大家多多交流。为了方便讨论,本...
    kyson老师阅读 5,753评论 0 50
  • deque构造函数 deque deqT;//默认构造形式 deque(beg, end);//构造函数将[beg...
    饭饭H阅读 3,315评论 0 0
  • 你还不够冷淡 面容的霜雪有些化开 你还不够绝情 身体的血液有些回温 在世人眼中 我希望你始终无动于衷 在岁月面前 ...
    阿琴姑娘阅读 4,483评论 76 88
  • 这些年,我都不敢回头望,也慢慢忘记了回忆的滋味,对于大学时代,对于高中时代,我只能偶尔叹息时间匆匆溜走,物是人非,...
    芷钰阅读 2,732评论 0 0