栈的基本应用
?前言?
之前已經(jīng)學(xué)習(xí)過了棧的相關(guān)知識點(diǎn),本次主要總結(jié)一下常見的棧的應(yīng)用實(shí)例
📘 博客主頁:to Keep博客主頁
🙆歡迎關(guān)注,👍點(diǎn)贊,📝留言評論
?首發(fā)時間:2022年1月16日
📨 博主碼云地址:博主碼云地址
📕參考書籍:java核心技術(shù) 卷1
📢編程練習(xí):牛客網(wǎng)+力扣網(wǎng)
由于博主目前也是處于一個學(xué)習(xí)的狀態(tài),如有講的不對的地方,請一定聯(lián)系我予以改正!!!
棧的應(yīng)用:
- 1 出棧與入棧順序問題:
- 1.1 選擇題
- 1.2 編程題
- 2 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
- 2.1 填空題:
- 2.2 編程題
- 3 括號匹配問題:
- 4 最小棧的問題
1 出棧與入棧順序問題:
1.1 選擇題
一個棧的入棧順序是A,B,C,D,E,則出棧順序不可能的是?( )
A EDCBA
B DECBA
C DCEAB
D ABCDE
題目中隱含的條件就是出棧的同時也是可以進(jìn)棧的
分析:
對于A選項(xiàng)而言就是不出棧,等A,B,C,D,E依次進(jìn)棧之后依次出棧,所以是符合棧的后進(jìn)先出特性的,對于B選項(xiàng)而言,等A,B,C,D進(jìn)棧之后,在對D進(jìn)行出棧,然后在將E進(jìn)棧,然后再把E出棧,最后將C,B,A依次出棧,因此B選項(xiàng)也是正確的,對于C選項(xiàng)與B選項(xiàng)對于,很明顯A是不能先于B出棧的,所以C選項(xiàng)是不符合的,D選項(xiàng)就是在進(jìn)棧的同時進(jìn)行出棧的操作,所以D選項(xiàng)也是符合要求的。
正確答案: C
1.2 編程題
代碼題:OJ鏈接
public class Solution {public boolean IsPopOrder(int [] pushA,int [] popA) {Stack<Integer> stack = new Stack<>();//創(chuàng)建一個棧int j = 0;//遍歷第二個數(shù)組for(int i = 0;i<pushA.length;i++){//遍歷第一個數(shù)組stack.push(pushA[i]);//將第一個數(shù)組依次入棧while(j<popA.length&&!stack.empty()&&stack.peek()==popA[j]){//當(dāng)J下標(biāo)元素與棧頂元素比較,是否相等,此時j必須是要有意義的,并且此時棧要不為空,才進(jìn)行出棧操作stack.pop();j++;}}return stack.empty();//如果符合棧的特性,那么最后一定會是一個空棧。否則就是不符合棧的特性的} }2 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
2.1 填空題:
將(5+4)*3-2(中綴表達(dá)式也被稱做為逆波蘭式)轉(zhuǎn)化為后綴表達(dá)式的結(jié)果為:
(1)按先加減后乘除的原則給表達(dá)式加括號
(2)在將符合移到對應(yīng)的括號之后,就可以得到對應(yīng)的后綴表達(dá)式
54+3*2-
2.2 編程題
逆波蘭表達(dá)式求值:OJ鏈接
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for(int i = 0;i<tokens.length;i++){String ch = tokens[i];if(!INT(ch)){//為整數(shù)值進(jìn)棧stack.push(Integer.parseInt(ch));//將字符串轉(zhuǎn)化為整數(shù)放入棧中}else{//如果為運(yùn)算符int num1 = stack.pop();int num2 = stack.pop();int num=0;switch(ch){case "+": num=num2+num1;break;case"-":num=num2-num1;break;case"*":num=num2*num1;break;case"/":num=num2/num1;break;}stack.push(num);}} return kohaostack.peek();}public boolean INT(String val){//判斷是否為符號if(val.equals("+")||val.equals("-")||val.equals("*")||val.equals("/")){return true;}return false;} }3 括號匹配問題:
對于棧中,括號匹配問題是一個挺重要的一個筆試的考點(diǎn),具體題目分析如下:
括號匹配問題詳解鏈接
4 最小棧的問題
最小棧:OJ鏈接
class MinStack {Stack<Integer> stack;Stack<Integer> minStack;public MinStack() {stack=new Stack<>();minStack=new Stack<>();}public void push(int val) {if(minStack.empty()){stack.push(val);minStack.push(val);return;}if(minStack.peek()>=val){stack.push(val);minStack.push(val);}else{stack.push(val);}}public void pop() {if(stack.peek()>minStack.peek()){stack.pop();}else{stack.pop();minStack.pop();}}public int top() {return stack.peek();}public int getMin() {return minStack.peek();} } 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 二叉树的基本概念以及基本操作
- 下一篇: 从源码出发:JAVA中对象的比较