一 棧的定義
棧是限定僅在表尾進行插入和刪除操作的線性表。
通常把允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱為lifo結構(last in first out)。
棧的插入操作,也叫做進棧,也稱為壓棧,入棧。
棧的刪除操作,叫做出棧,也有的叫做彈棧。
二棧的順序儲存結構
首先來看棧的結構定義:
typedef int selemtype;//型別根據實際需要而定,現在先定義為int型別
typedef struct
sqstack;
之後進行進棧的操作:
status push(sqstack*s,selemtype e)
s->top++;//棧頂指標增加一
s->data=e;//將新插入的元素賦值給棧頂空間
return ok;
}
最後出棧操作:
status pop(sqstack*s,selemtype e)
*e=s->data[s->top];//將要刪除的棧頂元素賦值給e
s->top--;//棧頂指標減一
return ok;
}
三 兩棧共享空間
陣列有兩個端點,兩個棧有兩個棧底,讓乙個棧的棧底成為陣列的始端,既下標為0處,另乙個成為陣列的末端,既下標為n-1處。兩個棧增加新元素,兩個端點就向中間延伸。
那什麼時候棧滿呢?想想極端情況,若棧2 是空棧,棧1 的top1等於n-1時,就是棧一滿了。反之,當棧1 為空棧時,top2等於0時,為棧2 滿。兩個棧見面時,也就是兩個指標之間相差1 時,既top1+1=top2為棧滿。
四棧的鏈式儲存結構
同煉表類似,鏈式儲存結構的優點是基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間,如果真的發生,那麼此時的計算機作業系統基本上面臨崩潰的邊緣,而不是這個鏈式棧是否溢位的問題。
通常情況下都將棧頂放在鍊錶的頭部,這樣頭指標的作用基本上失去了意義,對於鏈式棧來說是不需要頭結點的。
對於空棧來說,鍊錶的原定義是頭指標指向空,那麼鏈式棧的空其實就是top=null的時候。
鏈式棧的進棧和出棧的操作與鍊錶的插入刪除操作基本一樣,鍊錶那裡打好了基礎鏈式棧基本就沒有問題。
進棧操作:
status push(linkstack*s,selemtype e)
出棧操作:
status pop(linkstack*s,selemtype*e)
鏈式棧的進棧和出棧操作都很簡單,沒有任何的迴圈操作,時間複雜度均為o(1);
五 棧的應用
棧的應用主要是在遞迴的運用,在使用遞迴函式時,編譯器使用棧實現遞迴,我們在平常除錯**的時候是注意不到的,實際上編譯器進行函式的遞迴呼叫的時候就是使用了棧來儲存和查詢資料最後來進行彙總的。
棧還有乙個應用就是四則運算表示式求值,既字尾(逆波蘭)表示法定義,字尾表示式不同於我們平常的正常思維,在這裡說不清楚,附上鏈結單獨講字尾表示式。
python 基本內容
1.包 import 模組名 這個包首先在當前目錄找。每個模組中可以用 name 判斷是否為 main 來執行程式 建立包pack,建立乙個資料夾然後建立 init py import pack.filename pack.filename.f 引用包重新命名 import pack as newn...
Servlet基本內容
常用的狀態碼如下 200 請求成功。302 請求重定向。304 請求資源沒有改變,訪問本地快取。404 請求資源不存在。通常是使用者路徑編寫錯誤,也可能是伺服器資源已刪除。500 伺服器內部錯誤。通常程式拋異常。狀態資訊 狀態資訊是根據狀態碼變化而變化的 1 servlet技術 2 filter技術...
php基本內容
1.注釋 或者 name admin echo hello name 2.變數 以 開頭 name admin echo hello name 3.字串拼接 使用 name admin echo hello name 4.物件訪問屬性 使用 class obj o newobj echo o nam...