python資料結構與演算法——棧、佇列與雙端佇列

TechLee發表於2018-09-04

棧:是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端進行加入資料和輸出資料的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。

  • 由於只能在一端操作,因此按照後進先出的原理運作

棧的實現

支援操作:

  • Stack()建立一個新的空棧

  • push(item)新增一個新的元素item到棧頂

  • pop()彈出棧頂元素

  • peek()返回棧頂元素

  • is_empty()判斷棧是否為空

  • size()返回棧的元素個數

class Stack(object):
    """棧"""
    def __init__(self):
        self.__list = []
    
    def push(self, item):
        """加入元素"""
        self.__list.append(item)
   
    def pop(self):
        """彈出元素"""
        return self __list.pop()
    
    def peek(self):
        """返回棧頂元素"""
        if self.__list:
            return self.__list[-1]
        else:
            return None
    
    def is_empty(self):
        """判斷是否為空"""
        #return self.__list == []
        return not self__list
    
    def size(self):
        """返回棧的大小"""
        return len(self.__list)

if __name__ == "__main__":
    stack = Stack()
    stack.push("hello, world")
    stack.push("hello, python")
    stack.push("hello, China")
    print(stack.size())
    print(stack.peek())
    print(stack.pop())
    print(stack.pop()) 

佇列與雙端佇列

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

佇列是一種先進先出的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作。

佇列的實現

class Queue(object):
    """佇列"""
    def __init__(self):
        self.__list = []
        
    def enqueue(self,item):
        """往佇列中新增一個item元素"""
        self.__list.append(item)
    
    def dequeue(self):
        """從佇列頭部刪除一個元素"""
        return slef.pop(0)
        
    def is_empty(self):
        """判斷一個佇列是否為空"""
        return self.__list == []
        
    def size(self):
        """返回佇列的大小"""
        return len(self.__list)
        
if __name__ == "__main__":
    s = Queue()
    s.enqueque(1)
    s.enqueque(2)
    s.enqueque(3)
    s.enqueque(4)
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())

雙端佇列

雙端佇列,是一種具有佇列和棧的性質的資料結構

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

雙端佇列的實現

操作:

  • Deque()建立一個空的雙端佇列

  • add_front(item)從隊頭加入一個item元素

  • add_rear(item)從隊尾加入一個item元素

  • remove_front()從隊頭刪除一個item元素

  • remove_rear()從隊尾刪除一個item元素

  • is_empty()判斷雙端是否為空

  • size()返回佇列大小

class Deque(object):
    """雙端佇列"""
    def __init__(self):
        self.__list = []
    
    def add_front(self, item):
        """往佇列頭部新增一個item元素"""
        self.__list.insert(0, item)
        
    def add_rear(self, item):
        """往佇列尾部新增一個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 == []
    
    def size(self):
        """返回佇列大小"""
        return len(self.__list)

原創文章,轉載周知

持續更新…


個人部落格地址:www.limiao.tech


相關文章