1. 程式人生 > >資料結構(Python實現)之佇列及棧

資料結構(Python實現)之佇列及棧

昨天被面試官問到,怎麼實現一個佇列?佇列原理上很簡單,就是先進先出。我之前用C寫過,卻不曾用Python寫過,但Python只會更簡單不會更復雜。我思考了1秒鐘,告訴面試官,可以利用列表,append方法即是入隊,取出列表的第0元素即是出隊。回家後,我立即動手寫了一遍。鑑於棧與佇列只存在些許不同,本篇將一起實現棧。下面分享給大家。

----------------------------------------基本原理----------------------------------------

此處考慮初學者,對原理有了解的請跳過本步。

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端進行刪除操作,而在表的後端進行插入操作。

這也是其名稱的由來,這就像排隊一樣,先進先出,後進後出。

而棧與佇列唯一的不同即是,取出棧元素不是從頭部取出,而是尾部。即先進後出。就像槍械的子彈匣,後放進去的子彈反而先被髮射出去。

----------------------------------------程式碼----------------------------------------

class Queue(list):
    def __init__(self,args=[]):
        # 呼叫列表的初始化方法
        list.__init__([])
        # self現在被初始化為一個空列表,如果希望佇列被初始化,我們只需要把引數加到這個空列表裡
        self += args
    
    # 我們只需要新增一個取出方法即可
    def take(self):
        if self:
            temp = self[0]
            del self[0]
            return temp
        else:
            return None

# 棧
class Stack(list):
    def __init__(self,args=[]):
        list.__init__([])
        self += args
    
    # 棧的取出是在尾部,這是與佇列唯一不同的地方。其他地方不再贅述。
    def take(self):
        if self:
            temp = self[-1]
            del self[-1]
            return temp
        else:
            return None


if __name__ == '__main__':
    queue = Queue([1, 2, 3, 4, 5])
    print('佇列初始化',queue)
    queue.append(9)
    print('新增佇列',queue)
    for i in range(7):
        temp = queue.take()
        print('取出佇列',temp)
        print('當前佇列',queue)
    print('-' * 30, '分割線', '-' * 30)
    stack = Stack([1, 2, 3, 4, 5])
    print('棧初始化',stack)
    stack.append(9)
    print('新增棧',stack)
    for i in range(7):
        temp = stack.take()
        print('取出棧',temp)
        print('當前棧',stack)

----------------------------------------效果----------------------------------------