摘要:棧也稱為后進先出表棧的應用場景操作撤銷例如將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復上一步操作了。最后執(zhí)行完成,根據(jù)棧的結構開始彈出數(shù)據(jù),一步一步再走回方法。
數(shù)據(jù)結構-棧定義
棧(英語:stack)又稱為堆棧或堆疊,棧作為一種數(shù)據(jù)結構,它按照先進后出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來)。
由于堆疊數(shù)據(jù)結構只允許在一端進行操作,因而按照后進先出(LIFO, Last In First Out)的原理運作。棧也稱為后進先出表
例如:將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復上一步操作了。
程序調(diào)用的系統(tǒng)棧例如:A方法調(diào)用B方法得到返回值,B調(diào)用C得到返回值,A操作走到了B方法,這個時候可以將A的代碼位置存儲到棧中,然后走到B方法,B操作走到了C方法,這個時候可以將B的代碼位置存儲到棧中。最后C執(zhí)行完成,根據(jù)棧的結構開始彈出數(shù)據(jù),一步一步再走回A方法。
判斷括號是否有效。下文會有代碼實現(xiàn)(詳細規(guī)則描述可以參考leetcode第20題)開括號必須用同一類型的括號閉合。
開方括號必須按正確順序閉合。
例如:正確的:{[()]} [{()}] ({[]}) 等 。錯誤的:[{(})] [}{()] 等。
自定義棧基類的代碼實現(xiàn)棧在java.util有一個工具類,先不用,自定義實現(xiàn)一個
package com.datastructure.stack; public interface Stack{ /** * 向棧插入元素 * @param e */ public void push(E e); /** * 取出最上面的元素,并且返回 * @return */ public E pop(); /** * 獲取棧的大小 * @return */ public int getSize(); /** * 判斷棧是否為空 * @return */ public boolean isEmpty(); /** * 獲取棧最上面的元素 * @return */ public E peek(); }
package com.datastructure.stack; import com.datastructure.array.Array; /** * @program: test * @description: * @author: Mr.Yang * @create: 2019-05-02 15:27 **/ public class ArrayStackimplements Stack { Array array; public ArrayStack(int capacity){ array=new Array (capacity); } public ArrayStack(){ array=new Array (); } @Override public void push(E e) { array.addLast(e); } @Override public E pop() { return array.removeLast(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public E peek() { return array.getLast(); } /** * 獲取容量值 * @return */ public int getCapacity(){ return array.getCapacity(); } @Override public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("stack: "); sb.append("["); for(int i=0;i 測試代碼
package com.datastructure.stack; /** * @program: test * @description: * @author: Mr.Yang * @create: 2019-05-02 16:11 **/ public class StackTest { public static void main(String[] args) { ArrayStackintegerArrayStack = new ArrayStack<>(); for(int i=0;i<5;i++){ integerArrayStack.push(i); System.out.println(integerArrayStack); } Integer pop = integerArrayStack.pop(); System.out.println("----移除上級元素----value is "+pop); System.out.println("-------------移除之后的棧打印------------------"); System.out.println(integerArrayStack); } } 測試結果
stack: [0] right value is stack top stack: [0, 1] right value is stack top stack: [0, 1, 2] right value is stack top stack: [0, 1, 2, 3] right value is stack top stack: [0, 1, 2, 3, 4] right value is stack top ----移除上級元素----value is 4 -------------移除之后的棧打印------------------ stack: [0, 1, 2, 3] right value is stack topleetCode第20題,花括號正確閉合思路
根據(jù)棧的數(shù)據(jù)結構特點,我們可以先將所有左括號‘[{(’放進棧中,然后判斷當前字符如果是‘)]}’這種的右括號,但是棧頂?shù)睦ㄌ枀s不匹配,返回false
注意控制判斷
這里使用java自帶的棧工具類來實現(xiàn)
leetcode給的測試例子:
1 2 3 4 5 輸入例子 () ()[]{} (] ([)] {[]} 代碼實現(xiàn)
package com.datastructure.stack; import java.util.Stack; /** * @program: test * @description: * @author: Mr.Yang * @create: 2019-05-02 16:59 **/ public class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.isValid("{"name": "網(wǎng)站","num": 3,"sites": [ "Google.com", "Taobao.com", "Waibo.wang" ]}")); } public boolean isValid(String s) { Stackcharacters = new Stack<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == "{" || c == "[" || c == "(") { characters.push(c); } else { if(characters.isEmpty()){ return false; } Character peek = characters.pop(); switch (c) { case "}": if (!peek.equals("{")) { return false; } continue; case "]": if (!peek.equals("[")) { return false; } continue; case ")": if (!peek.equals("(")) { return false; } continue; } } } return characters.isEmpty(); } /*public boolean isValid(String s) { Stack characters = new Stack<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == "{" || c == "[" || c == "(") { characters.push(c); } else { if(characters.isEmpty()){ return false; } Character toChar = characters.pop(); if(c == ")" && toChar != "("){ return false; } if(c == "}" && toChar != "{"){ return false; } if(c == "]" && toChar != "["){ return false; } } } return characters.isEmpty(); }*/ } 如果想實現(xiàn)更多字符串關于括號的匹配,如JSON等等,可以根據(jù)棧的特點來實現(xiàn)
代碼例子GIT地址:https://git.dev.tencent.com/y...
項目簡介:
這個項目是我做測試,學習的主要項目,目前里面包含了:一些設計模式的demo(抽象工程模式,適配器模式,外觀模式,命令模式,裝飾者模式等等)
即將學習的數(shù)據(jù)結構demo,數(shù)組,棧,后續(xù)還會持續(xù)更新數(shù)據(jù)結構,可能會有隊列,鏈表,遞歸,紅黑樹,線段樹等等一系列,如果感興趣,歡迎留言。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74386.html
摘要:對于棧來說,這個表尾稱為棧的棧頂,相應的表頭稱為棧底。棧和隊列的區(qū)別棧的插入和刪除操作都是在一端進行的,而隊列的操作卻是在兩端進行的。出棧操作出棧操作就是在棧頂取出數(shù)據(jù),棧頂指針隨之下移的操作。 基本概念 棧和隊列都是動態(tài)的集合,在棧中,可以去掉的元素是最近插入的哪一個。棧實現(xiàn)了后進先出。在隊列中,可以去掉的元素總是在集合中存在的時間最長的那一個。隊列實現(xiàn)了先進先出的策略。 棧的官...
摘要:介紹棧是一種后進先出的線性表數(shù)據(jù)結構,分為棧頂和棧底兩端,僅允許在表的一端插入元素,這一端被稱為棧頂,另外一端稱之為棧底。 介紹 棧是一種后進先出的線性表數(shù)據(jù)結構,分為棧頂和棧底兩端,僅允許在表的一端插入元素,這一端被稱為棧頂,另外一端稱之為棧底。棧,只有兩種操作,分為入棧(壓棧)和出棧(退棧);向棧中添加元素的操作叫做入棧,相反從棧中刪除元素叫做出棧。 特點 只能從棧頂添加元素或者...
摘要:我們都知道數(shù)組是里面比較常用的一種數(shù)據(jù)結構,棧和數(shù)組類似,定義如下棧是一種遵從后進先出原則的有序集合。新增加和待刪除的元素都保存在棧的尾部,也稱棧頂,相反的另一端就叫棧底,在棧的這種數(shù)據(jù)結構里面,我們新增的元素都在棧頂,舊的元素都在棧底。 由于不是計算機專業(yè)出身,對數(shù)據(jù)結構這些了解的比較少,最近看了一些相關的書籍,這里做一些總結。本篇要說的是棧。我們都知道數(shù)組是JavaScript里面...
摘要:則會在轉移指令前執(zhí)行。總結與之間的關系如果在中含有語句,那么語句的還有作用嗎先看一段代碼如果你對內(nèi)存布局不是很清楚,請看這篇文章虛擬機類加載機制和字節(jié)碼執(zhí)行引擎重點關注運行時棧幀結構局部變量表槽,操作數(shù)棧。 定論 問:finally語句一定會執(zhí)行嗎?答: 如果沒有執(zhí)行相應的try語句則不會執(zhí)行。 在try語句中如果調(diào)用System.exit(0)方法則不會執(zhí)行。 問:finally...
摘要:棧的應用前面介紹了那么多棧相關的知識,最后也是介紹棧的應用場景的時候了,棧的實際應用非常廣泛,例如用來存儲訪問過的任務或路徑撤銷的操作。 棧的定義 什么是棧?棧是一種遵循后進先出原則的有序集合,新添加的或者待刪除的元素都保存在棧的同一端,稱為棧頂,另一端稱為棧底,在棧里,新元素靠近棧頂,舊元素靠近棧底,用個圖來看大概這樣式的:showImg(https://segmentfault.c...
摘要:調(diào)用棧的運行機制機制程序運行到一個函數(shù),它就會將其添加到調(diào)用棧中,當從這個函數(shù)返回的時候,就會將這個函數(shù)從調(diào)用棧中刪掉。在調(diào)用棧中每個調(diào)用偵都對應一個函數(shù),最上方的調(diào)用幀稱為當前幀,調(diào)用棧是由所有的調(diào)用偵形成的。 showImg(https://segmentfault.com/img/remote/1460000019244497?w=900&h=600); 調(diào)用棧的英文名叫做Cal...
閱讀 3344·2021-11-10 11:36
閱讀 3244·2021-10-08 10:21
閱讀 2841·2021-09-29 09:35
閱讀 2416·2021-09-22 16:06
閱讀 3959·2021-09-09 09:33
閱讀 1327·2019-08-30 15:44
閱讀 3171·2019-08-30 10:59
閱讀 2982·2019-08-29 15:32