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...