Python 数据结构与算法之队列(Queue)双端队列(Deque)的实现与应用

队列的数据结构模型:

队列是一种有次序的数据项集合, 在队列中, 数据项的添加总发生在一端(通常称为“尾端”rear),现存数据项的移除总发生在另一端(通常称为“首端”front)
“先进先出FIFO”。

使用Python实现ADT Queue:

选用最常用的数据集list来实现,选用list的首端(index=0)作为队列首端,list的尾端(index=-1)作为队列尾端。

class queue:

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

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

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

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

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

队列的应用:

  • 热土豆问题
from Queuetest import QueueModel

def hotPotato(nameList ,num):
    nameQueue = QueueModel.queue()
    for name in nameList:
        nameQueue.enqueue(name)
    while nameQueue.size() > 1:
        for i in range(num - 1):
            targetName = nameQueue.dequeue()
            nameQueue.enqueue(targetName)
        nameQueue.dequeue()
    return nameQueue.dequeue()


print(hotPotato(["A","B","C","D","E","F"],7))

双端队列的数据结构模型:

双端队列并不具有内在的LIFO或者FIFO特性
如果用双端队列来模拟栈或者队列,需要由使用者自行维护操作的一致性

使用Python实现ADT Deque:

class Deque:

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

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

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

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

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

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

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

双端队列的应用:

  • 回文词判定
from queue_test import deque_model


def pal_checker(input_str):

    char_deque = deque_model.Deque()
    for char in input_str:
        char_deque.add_rear(char)
    match = True

    while char_deque.size() > 1 and match:
        front_char = char_deque.remove_front()
        rear_char = char_deque.remove_rear()
        if front_char != rear_char:
            match = False

    return match


print(pal_checker("ASD"))
print(pal_checker("ASDDSA"))
print(pal_checker("ASDEDSA"))

你可能感兴趣的:(Python 数据结构与算法之队列(Queue)双端队列(Deque)的实现与应用)