Python中的棧
1、棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底,棧就相當於一個有底的水桶,出棧的過程就像倒出水的過程,是先進后出。
2、棧(Stack)是操作系統在建立某個進程或者線程時(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域。
一、棧的理解
【棧】就好比瀏覽器上【收藏夾】,人們把經常要瀏覽的網站地址放在【收藏夾】里,而真正的網頁信息是存儲在網頁所在公司租賃的【服務器】里的,並不是放在【收藏夾】里,這里的【服務器】就好比【堆】,【收藏夾】就好比【棧】;收藏夾(棧)只是記住了網頁的地址,它只是引用了【服務器】(堆)里的網頁信息
二、什么是棧?
棧是一種運算會受到相關限制的數據結構,簡單來說,棧就是一種數據的存儲方式。在這種數據的存儲方式中進行存入數據或者讀取數據的操作時,會受到相關規則的限制。
棧所遵循的存儲數據規則就是后進先出,是一種特殊的數據結構。
棧是只能在一端進行插入或刪除操作的特殊線性表,這一端被稱為棧頂,是浮動的一端;另一端被稱為棧底,是固定的一端。
先進入的元素被壓入棧底,最后進去的元素在棧頂,當需要讀取數據時,從棧頂依次彈出元素,最后一個數據最后才會出來。
棧中的元素個數為0,則是【空棧】,插入操作稱為【入棧】,刪除操作稱為【出棧】。
三、'棧'數據結構具有以下幾個特點:
- 棧相當於一端開口、一端封閉的容器;
- 數據可存儲在棧里面,把數據移動到棧里面的過程叫作進棧,也稱為壓棧、入棧;
- 棧只能對其棧頂的數據進行操作;
- 棧是一種先進后出的數據結構
棧的一端是開口的,一端是封閉的。開口的這一端可以進數據與出數據,閉合的這一端不能進數據,也不能出數據。閉合的這一端的位置稱為棧底。在最開始的時候,如果棧里面沒有數據,棧頂與棧底是重合的。在進入數據后,棧頂會逐漸往上移動,而棧底的位置始終處於閉合端所在的位置。
三、棧結構實現
棧可以用順序表實現,也可以用鏈表實現。
四、棧的操作
- Stack() 創建一個新的空棧
- push(item) 添加一個新的元素item到棧頂
- pop() 彈出棧頂元素
- peek() 返回棧頂元素,但不刪除
- is_empty() 判斷棧是否為空
- size() 返回棧的元素個數
--------為了更好的理解棧的存儲結構,不妨嘗試着將棧的存儲結構抽象一下,形成 “棧的普遍存儲結構圖示”,如果把棧底位置的下標標注為 -1,那么數據1所在的位置下標為0,數據2所在的位置下標為1,以此類推,數據 n 所在的位置下標為 n-1。其實數據 1 ~ 數據 n 的存儲的最基本形式就是列表,只不過這種列表里面的數據操作是受限制的,只能對列表中的最后一個元素進行操作。
-------- 在通過Python代碼進行棧的基本應用時,可以把棧的基本形態看成列表,只不過需要對這種列表的數據操作進行限制,比如只能在表的一端進行數據的插入和刪除等。
棧的完整代碼實現:
#棧的實現 class Stack(): def __init__(self,size): #在類中建立一個初始化方法 self.data=["null" for i in range(0,size)] #生成指定長度(size)的列表,並且該列表中的各元素數據初始時都是為null self.size=size #對棧的大小進行初始化 self.top=-1 #實現棧頂位置top的初始化 def push(self,content): #入棧 if self.Full(): print("棧已滿,不允許入棧!") else: self.top=self.top+1 self.data[self.top]=content #將新元素放到當前的棧頂位置所指向的存儲單元 def out(self): #出棧 if self.Empty(): print("棧已空,不允許出棧!") else: print(self.data[self.top]) self.data[self.top]="null" #使用賦一個特定值(如"null")的方式模擬清空操作 self.top=self.top-1 def Full(self): #判斷是否棧滿 if self.top==self.size-1: #用size表示棧的大小,則棧滿時棧頂的下標為size-1 return True else: return False def Empty(self): #判斷是否棧空 if self.top==-1: #當棧頂為-1時判斷該棧為空 return True else: return False
#創建一個大小為4的棧,將數據依次進棧 >>> s=Stack(4) >>> s.push("zcoder") >>> s.push("App") >>> s.push("Hhhhh") >>> s.push("Pink") #此時棧內已有四個數據,無法再進棧 >>> s.push("OK") 棧已滿,不允許入棧! >>> s.out() Pink >>> s.out() Hhhhh >>> s.out() App >>> s.out() zcoder >>> s.out() 棧已空,不允許出棧! #隨時可以使用Empty()與Full()方法分別判斷是否棧空或棧滿 >>> s.Empty() True >>> s.Full() False