Python實現隊列與雙端隊列 ------ Python數據結構與算法第6章

1. 隊列的概念

       隊列(queue)是 只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。 隊列是一種 先進先出 的(First In First Out)的線性表,簡稱FIFO。允許插入的一端爲隊尾,允許刪除的一端爲隊頭。隊列不允許在中間部位進行操作!假設隊列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣我們就可以刪除時,總是從a1開始,而插入時,總是在隊列最後。這也比較符合我們通常生活中的習慣,排在第一個的優先出列,最後來的當然排在隊伍最後。
在這裏插入圖片描述

2. 隊列的實現

      同棧一樣,隊列也可以用順序表或者鏈表實現: 具體的操作有:創建一個空的隊列、往隊列中添加一個item元素、從隊列頭部刪除一個元素、 判斷一個隊列是否爲空、返回隊列的大小。

class Queue():
    def __init__(self):
        self.__list = []

    def enqueue(self, item):
        # 如果出隊比入隊操作頻率高
        # self.__list.insert(0, item)
        # 如果入隊比出隊操作頻率高
        self.__list.append(item)

    def dequeue(self):
        # 如果出隊比入隊操作頻率高
        # self.__list.pop()
        # 如果入隊比出隊操作頻率高
        return self.__list.pop(0)

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

    def size(self):
        return len(self.__list)
        
        
# 創建一個空的雙端隊列
q = Queue()
q.enqueue(1)
q.enqueue(1.2)
q.enqueue('thanlon')
q.enqueue([1, 2, 3])
print('入隊狀態:已完成')
print('當前隊列是否爲空:', q.is_empty())
print('當前隊列的大小:', q.size())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
"""
入隊狀態:已完成
當前隊列是否爲空: False
當前隊列的大小: 4
1
1.2
thanlon
[1, 2, 3]
"""
3. 雙端隊列的概念

       雙端隊列(deque,全名double-ended queue),是一種具有 隊列和棧的性質的數據結構。雙端隊列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端隊列可以在隊列任意一端入隊和出隊。
在這裏插入圖片描述

4. 雙端隊列的實現

      雙端隊列兩端都可以入隊和出隊,相對於一般隊列操作要多幾步,具體的操作有: 創建一個空的雙端隊列、從隊頭加入一個item元素、從隊尾加入一個item元素、從隊頭刪除一個item元素、從隊尾刪除一個item元素、判斷雙端隊列是否爲空、返回隊列的大小。

class Dqueue():
    def __init__(self):
        self.__list = []

    def add_tail(self, item):
        """
        從隊列尾部添加元素
        :param item:
        :return:
        """
        self.__list.append(item)

    def remove_front(self):
        """
        從隊列頭部刪除元素
        :return:
        """
        return self.__list.pop(0)

    def add_front(self, item):
        """
        從隊列頭部添加元素
        :param item:
        :return:
        """
        self.__list.insert(0, item)

    def remove_tail(self):
        """
        從隊列尾部刪除元素
        :param item:
        :return:
        """
        return self.__list.pop()

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

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


# 創建一個空的雙端隊列
dq = Dqueue()
# 尾部添加元素,頭部刪除元素
dq.add_tail(1)
dq.add_tail(1.2)
dq.add_tail('thanlon')
dq.add_tail([1, 2, 3])
print('尾部已經完成元素的添加!')
print('當前隊列是否爲空:', dq.is_empty())
print('當前隊列的大小:', dq.size())
print(dq.remove_front())
print(dq.remove_front())
print(dq.remove_front())
print(dq.remove_front())
# 尾部添加元素,頭部刪除元素
dq.add_front(1)
dq.add_front(1.2)
dq.add_front('thanlon')
dq.add_front([1, 2, 3])
print('頭部已經完成元素的添加!')
print('當前隊列是否爲空:', dq.is_empty())
print('當前隊列的大小:', dq.size())
print(dq.remove_tail())
print(dq.remove_tail())
print(dq.remove_tail())
print(dq.remove_tail())
"""
尾部已經完成元素的添加!
當前隊列是否爲空: False
當前隊列的大小: 4
1
1.2
thanlon
[1, 2, 3]
頭部已經完成元素的添加!
當前隊列是否爲空: False
當前隊列的大小: 4
1
1.2
thanlon
[1, 2, 3]
"""

Github:https://github.com/ThanlonSmith/Data-Structure-Python3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章