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