大話數據結構 - 棧與隊列

大話數據結構第四章:棧與隊列;棧、隊列以及鏈表同屬線性表。

棧:先進後出;因此棧是隻允許在表尾進行插入和刪除的。進指壓棧,出指彈棧。

隊列:先進先出,與排隊一樣,先進先出,先到先得。


1. 棧

1.1 棧

棧是限定僅在表尾進行插入和刪除操作的線性表,我們把允許進行操作的一段稱爲棧頂,另一端稱爲棧底。不含任意元素的棧稱爲空棧。

棧的插入操作叫做進棧,棧的刪除操作稱爲出棧。值得注意的是:並非所有元素全部進棧之後元素才能出棧。比如1,2,3三個元素依次入棧,那麼出棧的順序可能會有哪些呢?

1. 1,2,3進; 然後3,2,1出
2. 1進1出; 2進2出; 3進3出
3. 1進2進; 2出; 3進; 3出; 1出
4. 1進2進; 2出; 1出; 3進; 3出
5. 1進1出; 2進3進; 3出2出

1.2 棧的Python實現

# -*- coding: utf-8 -*-

class Stack:
    def __init__(self, length):
        self.length = length
        self.top = -1
        self.data = []
        
    def push(self, ele):
        """
        壓棧
        """
        if self._isfull():
            raise(Exception("The stack is full."))
        else:
            self.data.append(ele)
            self.top += 1
            
    def pop(self):
        """
        彈棧
        """
        if self._isEmpty():
            raise(Exception("The stack is empty."))
        else:
            self.data = self.data[:-1]
            self.top -= 1
            
    def display(self):
        """
        打印棧中的所有元素
        """
        print("\n當前棧中的元素有: {0}".format(self.data))
        
    def _isfull(self):
        """
        判斷是否滿棧
        """
        if self.top >= self.length - 1:
            return True
        else:
            return False
        
    def _isEmpty(self):
        """
        判斷是否空棧
        """
        if self.top == -1:
            return True
        else:
            return False
        
if __name__ == "__main__":
    obj = Stack(5)
    
    for i in range(10, 15):
        obj.push(i)
    obj.display()
        
    for i in range(5):
        obj.pop()
    obj.display()

1.3 棧的應用

棧最知名的應用當屬遞歸,其次在高級計算器中進行復雜的四則混合運算也需要用棧將我們日常使用的中綴表達式轉化爲後綴表達式,從而能夠讓計算器進行四則混合運算。

# -*- coding: utf-8 -*-

class Stack:
    def __init__(self, length):
        self.length = length
        self.top = -1
        self.data = []
        
    def push(self, ele):
        """
        壓棧
        """
        if self._isfull():
            raise(Exception("The stack is full."))
        else:
            self.data.append(ele)
            self.top += 1
            
    def pop(self):
        """
        彈棧
        """
        if self._isEmpty():
            raise(Exception("The stack is empty."))
        else:
            self.data = self.data[:-1]
            self.top -= 1
            
    def display(self):
        """
        打印棧中的所有元素
        """
        print("\n當前棧中的元素有: {0}".format(self.data))
        
    def _isfull(self):
        """
        判斷是否滿棧
        """
        if self.top >= self.length - 1:
            return True
        else:
            return False
        
    def _isEmpty(self):
        """
        判斷是否空棧
        """
        if self.top == -1:
            return True
        else:
            return False
        
if __name__ == "__main__":
    obj = Stack(5)
    
    for i in range(10, 15):
        obj.push(i)
    obj.display()
        
    for i in range(5):
        obj.pop()
    obj.display()

2. 隊列

隊列是先進先出的線性表,在隊頭進行刪除,隊尾進行插入。隊列經常應用於操作系統的應用程序排隊、客服系統等等。

發佈了139 篇原創文章 · 獲贊 141 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章