資料結構 棧

2021-10-25 21:03:10 字數 2291 閱讀 5837

原文1

原文2

什麼是棧

棧相對於陣列結構做了一些限制。在使用陣列結構的時候,我們可以任意的取出陣列內的任何元素,也可以隨意在指定位置插入元素,而棧卻對元素的獲取與插入做了一些限制。

棧只允許訪問乙個資料項:即最後插入的資料。移除這個資料項後才能訪問倒數第二個插入的資料項。它是一種後進先出的資料結構。就好像打手槍,你的子彈夾,先裝進彈夾的子彈,最後被打出來(左輪另說)。

**實現
只對棧最基本的操作:出棧、入棧等操作進行了簡單實現,沒有對可能的異常進行處理。

public

class

stack

public

stack

(int size)

//入棧並返回入棧元素,棧頂下標加1,棧內元素加1

public e push

(e element)

//出棧並返回棧頂元素,棧頂下標減1,棧內元素減1

public e pop()

//返回棧頂元素

public e peek()

//判斷棧是否為空

public

boolean

isempty()

//返回棧內元素個數

public

intsize()

//tostring方法

@override

public string tostring()

stringbuilder sb =

newstringbuilder()

; sb.

('[');

//當棧內不為空時,拼接

for(

int i =

0; i < elementnum; i++

) sb.

(',');

}return null;

}}

實戰應用

實戰一:十進位制轉換二進位制

我們都知道,十進位制轉二進位制是將乙個數每次都除以2,一直到無法再除以2以後,倒著將每次除以2後獲得的餘數連線起來,就是正確的二進位制數,如下圖

所以,我們可以看到,最先獲得的餘數是最後才被取走的,這是乙個很典型的棧結構的例子。每次除得的餘數,就對其進行入棧操作,最後再進行多次出棧操作就可以實現十進位制轉二進位制的功能了。

**實現
public

static string d2b

(integer number)

while

(!stack.

empty()

)return result;

}

實戰二:分隔符匹配
如果我們寫的**中如果多了乙個「」,或者括號的順序錯亂,都會報錯。接下來我們就用棧來模擬這種分隔符匹配。

思路:當讀取一段程式時,如果發現它是左分隔符(),彈出棧頂元素,並且檢視它是否和該右分隔符匹配。如果它們不匹配,則程式報錯。如果到最後一直存在著沒有被匹配的分隔符,程式也報錯。

我們來看下面這個正確的字串:a,在棧中的變化過程:

所讀字元

棧中內容a空

空**實現

public

class

brecketchecker

//檢查分隔符匹配的方法

public string check()

stack stack =

newstack()

;char

chars = input.

tochararray()

;for

(int i=

0;i:if

(!stack.

isempty()

)'))

return

"**有誤;位置:"

+ i +

";**:"

+ achar;

//不為三種正確情況,出錯

}else

default

:break;}

}if(stack.

isempty()

)return

"**有誤;有括號沒有關閉";}

}

資料結構 棧 棧

可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...

資料結構 棧

例子 棧是一種被限制在只能在表的一端進行插入和刪除運算的線性表。區域性變數是用棧來儲存的 可以進行插入和刪除的一端稱為 棧頂 top 另一端稱為 棧底 bottom 當表中沒有元素時 表長為0的棧 稱為 空棧。棧的修改是按 後進先出的原則進行,因此棧被稱為後進先出 last in first out...

資料結構 棧

1.棧stack 是限定僅在表尾進行刪除和插入操作的線性表。允許插入刪除的一端叫做棧頂top,另外一端叫做棧底bottom。棧又稱為後進先出 lifo 的線性表。即表尾是指棧頂。2.順序棧 定義 top指向可存入元素的位置。typedef struct stacktypestacktype 插入 進...