算法與數據結構(part5)--棧與隊列

學習筆記,僅供參考,有錯必糾



算法與數據結構–基於python



棧是什麼


  • 棧的概念

    • 棧(stack)是一種容器,可存入數據元素、訪問元素、刪除元素。

    • 它的特點在於只能允許在容器的一端(稱爲棧頂端指標)進行加入數據(push)和輸出數據(pop)的運算。

    • 沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種默認的訪問順序。

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


  • 圖示


棧(ADT)的操作


Stack() 
#創建一個新的空棧
push(item) 
#添加一個新的元素item到棧頂
pop() 
#彈出棧頂元素
peek() 
#返回棧頂元素
is_empty() 
#判斷棧是否爲空
size() 
#返回棧的元素個數

棧的實現


定義一個棧:

class Stack:
    # 初始化空棧
    def __init__(self):
        self.__list = []

    def push(self, item):
        self.__list.append(item)

    def pop(self):
        if self.__list:
            return self.__list.pop()
        else:
            return None

    def peek(self):
        if self.__list:
            return self.__list[-1]
        else:
            return None

    def is_empty(self):
        return self.__list is None

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

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

輸出:

3
2
1

隊列


隊列是什麼


  • 隊列的概念
    • 隊列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作線性表
    • 隊列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。

  • 圖示


隊列的操作


Queue()
#創建一個新的空隊列
enqueue(item)
#往隊列中添加一個item元素
dequeue()
#從隊列頭部刪除一個元素
is_empty()
#判斷一個隊列是否爲空
size()
#返回隊列的大小

隊列的實現


定義一個隊列:

# 定義隊列
class Queue:
    # 初始化
    def __init__(self):
        self.__list = []
    def enqueue(self,item):
        self.__list.append(item)
    def dequeue(self):
        return self.__list.pop(0)
    def is_empty(self):
        return self.__list is None
    def size(self):
        return len(self.__list)

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

輸出:

1
2
3

雙端隊列


雙端隊列是什麼


  • 雙端隊列的概念

    • 雙端隊列(deque,全名double-ended queue),是一種具有隊列和棧的性質的數據結構。

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


  • 圖示


雙端隊列的操作


Deque()
#創建一個空的雙端隊列
add_front(item)
#從隊頭加入一個item元素
add_rear(item)
#從隊尾加入一個item元素
pop_front()
#從隊頭取一個item元素
pop_rear()
#從隊尾取一個item元素
is_empty()
#判斷雙端隊列是否爲空
size()
#返回隊列的大小

雙端隊列的實現


class Deque:
    def __init__(self):
        self.__list = []
    def add_front(self,item):
        self.__list.insert(0,item)
    def add_rear(self,item):
        self.__list.append(item)
    def pop_front(self):
        return self.__list.pop(0)
    def pop_rear(self):
        return self.__list.pop()
    def is_empty(self):
        return self.__list is None
    def size(self):
        return len(self.__list)

if __name__ == '__main__':
    d = Deque()
    d.add_front(1)
    d.add_front(2)
    d.add_rear(3)
    d.add_rear(4)
    print(d.size())
    print(d.pop_front())
    print(d.pop_front())
    print(d.pop_rear())
    print(d.pop_rear())

輸出:

4
2
1
4
3

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