数据结构-栈(Stack)
一、什么是棧
棧是一種線性結(jié)構(gòu),相對于數(shù)組,棧對應(yīng)的操作是數(shù)組的子集,只能從一端添加元素,也只能從一端取出元素 ,這一端成為棧頂。棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)(Last In First Out–LIFO),在計算機(jī)的世界里,棧擁有著不可思議的作用。
二、棧的應(yīng)用
2.1 在word或者其他編輯器中,當(dāng)我們輸入一些文本內(nèi)容的時候,就用到了棧。(舉例:”沉迷學(xué)習(xí)無法自拔”)
在這個棧中,沉迷,學(xué)習(xí),無法,自拔這些詞依次入棧,但是當(dāng)我們發(fā)現(xiàn) “無法”誤寫為“不法”時候,這時我們會執(zhí)行撤銷操作,自拔會先出棧,然后不法也會出棧,最后重新寫入"無法"和“自拔”,也就是他們會依次入棧。
2.2 用這樣的一個系統(tǒng)棧來記錄調(diào)用過程中中斷的那個調(diào)用的點 (即解釋了子過程子邏輯的調(diào)用我編譯器內(nèi)部運行實現(xiàn)的機(jī)理)
當(dāng)先執(zhí)行函數(shù)A的第二行的時候會執(zhí)行函數(shù)B,而暫時中斷函數(shù)A的執(zhí)行,此時在系統(tǒng)棧中會記錄一個信息(A 2),即之前的程序執(zhí)行到A這個函數(shù)的第二行了,在這里進(jìn)行了中斷,現(xiàn)在開始執(zhí)行B這個函數(shù)了。同理,執(zhí)行函數(shù)B的第二行的時候會執(zhí)行函數(shù)C,同樣在系統(tǒng)棧中會記錄一個信息(B2),即執(zhí)行B函數(shù)的第二行時中斷了。當(dāng)執(zhí)行完C函數(shù)的時候, 此時看一下系統(tǒng)棧,位于棧頂?shù)脑厥荁2,根據(jù)“棧頂?shù)脑叵瘸龅脑瓌t”,計算機(jī)就會明白,剛才執(zhí)行到B2了,這時就會從B函數(shù)第三行開始依次執(zhí)行B函數(shù)(B2出棧了),然后再返回到A函數(shù)直至執(zhí)行完(A2出棧)。當(dāng)A2出棧后,再看一下系統(tǒng)棧,發(fā)現(xiàn)系統(tǒng)棧是空的,說明系統(tǒng)棧已經(jīng)沒有之前中斷執(zhí)行到一半這樣的調(diào)用過程了,即整個過程已經(jīng)執(zhí)行完了。
2.3 括號匹配 題目
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認(rèn)為是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
三、棧的實現(xiàn)
3.1 Stack接口
package lcy.Array;public interface Stack<E> {int getSize();boolean isEmpty();void push(E e); //向棧中添加元素E pop();//向棧中取出元素E peek();//查看棧頂?shù)脑?/span> }3.2 基于動態(tài)數(shù)組來實現(xiàn)(實現(xiàn)類)
package lcy.Array;public class ArrayStack<E> implements Stack<E> {//基于動態(tài)數(shù)組實現(xiàn)棧MyArray<E> array;public ArrayStack(int capacity) {array = new MyArray<>(capacity);}public ArrayStack() {array = new MyArray<>();}@Overridepublic int getSize() {return array.getSize();}@Overridepublic boolean isEmpty() {return array.isEmpty();}public int getCapacity() {return array.getCapacity();}//向棧中添加元素@Overridepublic void push(E e) {array.addLast(e);}//向棧中取出元素@Overridepublic E pop() {return array.removeLast();}//查看棧頂?shù)脑?/span>@Overridepublic E peek() {return array.getLast();}@Overridepublic String toString() {StringBuffer res = new StringBuffer();res.append("Stack:");res.append('[');for (int i = 0; i < array.getSize(); i++) {res.append(array.get(i));if (i != array.getSize() - 1) {res.append(", ");}}res.append("] top");return res.toString();}}3.3 編寫測試類StackMain以及運行結(jié)果截圖
package lcy.Array;public class StackMain {public static void main(String[] args) {ArrayStack<Integer> stack = new ArrayStack<>();for (int i = 0; i < 5; i++) {stack.push(i);System.out.println(stack);}stack.pop();System.out.println(stack);} }總結(jié)
以上是生活随笔為你收集整理的数据结构-栈(Stack)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库简介及类型
- 下一篇: S5PV210 LCD屏