資料結構 二 棧

2021-09-11 04:20:59 字數 2984 閱讀 5747

1. 簡介

1.1 棧stack

(1)棧是一種線性結構

(2)相比陣列,棧對應的操作是陣列操作的子集。

(3)棧的本質就是乙個陣列,我們把資料排開來放,但是規定:

新增元素的時候只能從一端新增元素,也只能從一端取出元素。

這一段通常稱為「棧頂」

1.2 新增資料的規則

(1) 相當於在在乙個桶中新增資料。這個操作叫入棧。

(2) 第乙個資料在棧的底部

(3) 取出元素的時候只能取最頂部的元素。

(4) 最後乙個資料在棧頂

1.3 棧的特質

(1) 棧是一種後進先出的資料結構[lifo](last in first out)

(2) 計算機的世界中,棧擁有著不可思議的作用

2.棧和棧的應用    

2.1 無處不在的undo操作(撤銷)

(1) 實質:向棧中推入元素和向棧頂中取出元素。

(2) 例如: 

a. 輸入「沉迷」     (bottom [沉迷] top)

b. 輸入「學習」     (bottom [沉迷 學習] top)

c. 輸入「不法」     (bottom [沉迷 學習 不法] top)

d. 撤銷輸入「不法」  (bottom [沉迷 學習] top)

--從編輯器的棧中拿出棧頂的元素

--通過棧頂的元素確定最近的操作是什麼

--發現是最近的操作是輸入了「不法」,這次撤銷操作就是刪除「不法」

--做完撤銷後,輸入「不法」這個動作也不需要被棧保留。所以就出棧了

2.2 棧的應用:程式呼叫的系統棧

(1)例如:

func a()

func b()

func c()

(2) 執行順序

a. 開始執行a()函式,執行第一行,第二行

b. 在執行a()的第二行的時候,要呼叫b()子程式,暫時中斷a()的執行.

棧:  (bottom [a(2)] top)

c. 開始執行b()函式,執行第一行,第二行

d. 在執行b()的第二行的時候,要呼叫c()子程式,暫時中斷b()的執行.

棧:  (bottom [a(2) b(2)] top)

e. 開始執行c()函式,執行第一行,第二行,第三行。執行完畢。

f. 對於系統棧來說,棧頂的元素是b(2).計算機就知道了:當時是執行b()到第二行中斷了,中斷跳到c(),但是此時c()已經執行完畢了,就可以跳回到b(2)的位置。這樣,系統棧就成功給計算機找到了上一次執行的位置。

g. 回到b(2)繼續執行,記錄的b(2)也就沒用了,它就可以出棧了。

棧: (bottom [a(2)] top)

h. 開始執行c(),第三行。執行完畢。

i. 檢視棧頂元素為a(2) .....[f,g]

棧: (bottom [ ] top)

j. 開始執行a(),第三行。執行完畢。

k. 執完之後計算機又沒有什麼可執行了,這個時候檢視系統棧為空。說明已經沒有中斷執行到一半的呼叫過程了。計算機就知道了,整個過程就已經執行完了。

(3) 總結

這就是在我們程式設計進行子過程呼叫的時候,當乙個子過程執行完成之後,可以自動的回到上層呼叫中斷的位置繼續執行下去的背後原因。因為有乙個系統棧來記錄每一次呼叫過程中[中斷]的呼叫點。

也就是:子過程子邏輯的呼叫在我們的編譯器內部執行實現的機理。

1. 需要實現的方法--stack

具體的底層實現使用者不關心。而且實際底層有多種實現方法。

1.1 void push(e) 向棧中新增乙個元素(入棧) -- o(1):即使有resize,也是o(1)

1.2 e pop()  從棧中取出棧頂的元素

1.3 e peek()  檢視棧頂的元素是什麼

1.4 int getsize()  

1.5 boolean isempty()

2. 這個**設計的思想

為了讓整個程式的邏輯更加清晰,同時也是為了支援物件導向的一些特性。比如說:多型。

2.1 設計乙個結構stack,定義了以上5種操作

2.2 用arraystack實現stack,具體實現操作。

2.3 使用寫好的資料arraydemo類中的方法。

3. 時間複雜度分析

所有的都是o(1)的

4. **實現

4.1 介面

public inte***ce stack

4.2 底層實現

public class arraystackimplements stack 

public arraystack()    

@override

public int getsize()

@override

public boolean isempty()

//對於我們的底層是實現是乙個靜態陣列,所以使用者可能需要檢視陣列容積。getcapacity()不是介面的一部分,是因為stack介面是和棧的具體實現無關的,只有在我們使用動態陣列來實現棧的時候,才存在容積整個概念。

public int getcapacity()

public void push(object e)

@override

public e pop()

@override

public e peek()

@override

public string tostring()

stack.pop();

system.err.println(stack);

}

public boolean isvaild(string s)else

if(c==']' && topchar!='[')

if(c=='}' && topchar!='}}

return stack.isempty();        

}

資料結構(二)棧結構

template t stack pop void temp stacklist top top return temp 從棧頂壓入出乙個元素 templatet t stack push const t item top stacklist top item 讀棧頂元素 template t st...

資料結構(二) 棧

棧也是一種線性儲存結構,具有先進後出的特點 word中的撤銷操作,作業系統的方法呼叫都利用了棧 棧還可以用來做匹配,比如括號匹配等 基於陣列的棧入棧push使用陣列的addlast 追加 取資料時使用陣列的getlast 做出棧pop 操作 這次模擬實現的棧是基於上篇部落格實現的動態陣列實現的 pu...

資料結構(二) 棧

棧 stack 僅僅可以表尾插入和刪除操作。即我們可以認為,棧是先進後出的。棧就是一種特殊的線性表,即它存在前驅後繼關係。它特殊點在於,它限制了整個線性表的插入和刪除位置,只能在棧頂進行。函式名功能 initstack s 建立乙個空的棧s destroystack s 銷毀乙個棧s clearst...