【python】Stack / Queue

https://www.bilibili.com/video/av53583801/?p=32
學習筆記

1 Stack

在這裏插入圖片描述
棧只是一個容器,數據存儲形式不侷限於某一種,比如順序表、鏈表都可以,只要滿足 FILO(First in Last out)。爲了方便,我們這裏採用順序表的形式實現棧,因爲 python 的 list 就可以當順序表用!

class Stack(object):
    "棧"
    def __init__(self):
        self.__list = [] # 用列表,也即順序表的數據存儲方式

    def is_empty(self):
        "判斷棧是否爲空,空返回True"
        return self.__list == []

    def size(self):
        "求棧元素的個數"
        return len(self.__list)

    def push(self,item):
        "進棧"
        self.__list.append(item) #這裏選擇在尾巴上加,複雜度 o(1),如果用insert在頭上加複雜度爲o(n)

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

    def pop(self):
        "出棧"
        if self.is_empty():
            return None
        else:
            return self.__list.pop()

if __name__ == "__main__":
    s = Stack()
    print("empty:",s.is_empty())
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    print("empty:",s.is_empty())
    print("size:",s.size())
    print("peek:",s.peek())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())

output

empty: True
empty: False
size: 4
peek: 4
4
3
2
1

2 Queue

用 list 實現的話,如果頭入O(n)尾出O(1),和尾入O(1)頭出O(n),複雜度都是 O(n)!這個時候要根據實際操作來選擇合適的寫法,比如你是經常入隊列的話,建議用尾入O(1)頭出O(n),如果你是經常出隊列的話,就頭入O(n)尾出O(1)

在這裏插入圖片描述

class Queue(object):
    "隊列"
    def __init__(self):
        self.__list = [] # 用列表,也即順序表的數據存儲方式

    def is_empty(self):
        "是否爲空"
        return self.__list==[]

    def enqueue(self,item):
        "入隊列"
        self.__list.append(item)

    def dequeue(self):
        "出隊列"
        if self.is_empty():
            return None
        else:
            return self.__list.pop(0)

    def size(self):
        "求隊列的長度"
        return len(self.__list)

    def peek(self):
        "查看隊首元素"
        if self.is_empty():
            return None
        else:
            return self.__list[0]

if __name__ == "__main__":
    q = Queue()
    print("empty:",q.is_empty())
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    q.enqueue(4)
    print("empty:",q.is_empty())
    print("size:",q.size())
    print("peek:",q.peek())
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())
    print(q.dequeue())

output

empty: True
empty: False
size: 4
peek: 1
1
2
3
4

3 Double-End Queue

在這裏插入圖片描述
和隊列的區別就是,頭部可入可出,尾部可入可出!我們實現的時候頭部指的是 list 下標爲 0 的地方!當然你也可以讓 list 的最後一個元素是頭部!

class DeQueue(object):
    "雙端隊列"
    def __init__(self):
        self.__list = [] # 用列表,也即順序表的數據存儲方式

    def is_empty(self):
        "是否爲空"
        return 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):
        "頭出隊列"
        if self.is_empty():
            return None
        else:
            return self.__list.pop(0)

    def pop_rear(self):
        "尾出隊列"
        if self.is_empty():
            return None
        else:
            return self.__list.pop()
        
    def size(self):
        "求隊列的長度"
        return len(self.__list)

    def peek(self):
        "查看隊首元素"
        if self.is_empty():
            return None
        else:
            return self.__list[0]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章