Python中的棧 || Python中的堆棧結合 


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

 Python中的堆棧結合

1、內存中的堆棧和數據結構中的堆棧不是一個概念,可以說內存中的堆棧是真實存在的物理區,數據結構中的堆棧是抽象的數據存儲結構。

2、內存空間在邏輯上分為三部分:代碼區、靜態數據區和動態數據區,動態數據區又分為棧區和堆區。

​3、代碼區:存儲方法體的二進制代碼。高級調度(作業調度)、中級調度(內存調度)、低級調度(進程調度)控制代碼區執行代碼的切換。

4、靜態數據區:存儲全局變量、靜態變量、常量,常量包括final修飾的常量和String常量。系統自動分配和回收。

5、棧區:存儲運行方法的形參、局部變量、返回值。由系統自動分配和回收。

6、堆區:new一個對象的引用或地址存儲在棧區,指向該對象存儲在堆區中的真實數據。【創建對象時,變量名引用對象;被引用對象的地址存儲在棧區,地址指向的對象存儲在堆區】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM