1. 程式人生 > >棧和佇列的結構實現

棧和佇列的結構實現

棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,英語:top)進行加入資料(英語:push)和輸出資料(英語:pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。

由於棧資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。

寫一個棧類支援以下操作 用python的LIST儲存:

棧的操作

  • Stack() 建立一個新的空棧
  • push(item) 新增一個新的元素item到棧頂
  • pop() 彈出棧頂元素
  • peek() 返回棧頂元素
  • is_empty() 判斷棧是否為空
  • size() 返回棧的元素個數
class Stack:
    def __init__(self):
        self.__list = []

    def push(self,item):#新增一個新的元素item到棧頂
        self.__list.append(item)

    def pop(self):#彈出棧頂元素
        return self.__list.pop()

    def peek(self):#返回棧頂元素
        if self.__list:
            return self.__list[-1]
        else:
            return False

    def is_empty(self):#判斷棧是否為空
        return self.__list == []

    def size(self):#返回棧的元素個數
        return len(self.__list)


if __name__ == '__main__':
    stack = Stack()
    stack.push(1)
    stack.push(2)
    stack.push(3)
    stack.push(4)
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())
    print(stack.pop())

 

佇列

佇列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

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

 

佇列的實現

同棧一樣,佇列也可以用順序表或者連結串列實現。

操作

  • Queue() 建立一個空的佇列
  • enqueue(item) 往佇列中新增一個item元素
  • dequeue() 從佇列頭部刪除一個元素
  • is_empty() 判斷一個佇列是否為空
  • size() 返回佇列的大小

在隊頭入隊隊尾隊出隊還是隊頭出隊隊尾入隊,看你個人需求,因為這兩種的出隊入隊總有一個時間複雜度時N一個為1,看你的實際需求,是出隊多還是入隊多。

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

    def enqueue(self,item): #往佇列中新增一個item元素
        self.__list.append(item)
        # self.__list.insert(0,item)
    def dequeue(self):# 從佇列頭部刪除一個元素
        # self.__list.dequeue()
        return self.__list.pop(0)
    def is_empty(self): #判斷一個佇列是否為空
        return self.__list == []
    def size(self): #返回佇列的大小
        return len(self.__list)

if __name__ == '__main__':
    queue = Queue()
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    queue.enqueue(4)
    print(queue.dequeue())
    print(queue.dequeue())
    print(queue.dequeue())
    print(queue.dequeue())

雙端佇列

雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。

雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。

操作

  • Deque() 建立一個空的雙端佇列
  • add_front(item) 從隊頭加入一個item元素
  • add_rear(item) 從隊尾加入一個item元素
  • remove_front() 從隊頭刪除一個item元素
  • remove_rear() 從隊尾刪除一個item元素
  • is_empty() 判斷雙端佇列是否為空
  • size() 返回佇列的大小
class Queue:
    def __init__(self):
        self.__list = []

    def add_front(self,item): #往佇列頭部新增一個item元素
        self.__list.insert(0,item)

    def add_last(self, item):  # 往佇列尾部新增一個item元素
        self.__list.append(item)

    def pop_front(self):
        return self.__list.pop(0)

    def pop_last(self):
        return self.__list.pop(-1)

    def is_empty(self): #判斷一個佇列是否為空
        return self.__list == []
    def size(self): #返回佇列的大小
        return len(self.__list)

if __name__ == '__main__':
    queue = Queue()
    queue.add_front(1)
    queue.add_front(2)
    queue.add_last(4)
    queue.add_last(5)
    queue.add_front(3)
    queue.add_last(6)
    print(queue.pop_front())
    print(queue.pop_last())
    print(queue.pop_front())