python數據結構——棧、隊列、雙端隊列

一、棧

1. 概述

棧是一種容器,它可以存入元素、訪問元素、刪除元素,它的特點在與只能允許在容器的一端(棧頂top)進行加入數據和輸出數據的運算。由於棧數據結構只允許在一端進行操作,因而按照先進後出(LIFO,Last In First Out)的原理操作。
在這裏插入圖片描述

2. 棧的實現
class Stack(object):
    """棧:順序表list實現"""

    def __init__(self):
        super(Stack, self).__init__()
        self.__list = []

    def push(self, item):
        """入棧(壓棧)"""
        self.__list.append(item)

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

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

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

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

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

二、隊列

1. 概述

隊列只允許在一端進行插入操作,而在另一端進行刪除操作的線性表,對列是一種先進先出的線性表,簡稱爲FIFO, 允許插入的一端爲隊尾,允許刪除的一端爲對頭,隊列中不允許在中間部位進行操作。
在這裏插入圖片描述

2. 隊列的實現
class Queue(object):
    """隊列:順序表list實現"""

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

    def dequeue(self, item):
        """向隊列頭部添加一個元素"""
        self.__list.insert(0, item)

    def enqueue(self):
        """從隊列頭部刪除一個元素"""
        return self.__list.pop()

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

    def size(self):
        """返回隊列的元素個數"""
        return len(self.__list)


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

三、雙端隊列

1. 概述

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

2. 雙端隊列的實現
class Deque(object):
    """docstring for Deque"""

    def __init__(self):
        super(Deque, self).__init__()
        self.__list = []

    def add_front(self, item):
        """從隊頭加入一個元素"""
        self.__list.insert(0, item)

    def add_finall(self, item):
        """從隊尾加入一個元素"""
        self.__list.append(item)

    def pop_front(self):
        """刪除隊頭的元素"""
        return self.__list.pop(0)

    def pop_finall(self):
        """刪除隊尾的元素"""
        return self.__list.pop()

    def is_empty(self):
        """判斷雙端隊列是否爲空"""
        return self.__list == []

    def size(self):
        """返回雙端隊列的元素個數"""
        return len(self.__list)


if __name__ =='__main__':
    q = Deque()
    q.add_front(1)
    q.add_front(2)
    q.add_front(3)
    q.add_front(4)
    q.add_finall(5)
    print(q.pop_front())
    print(q.pop_front())
    print(q.pop_front())
    print(q.pop_finall())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章