java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)
1.題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
2.思路
首先要理解為什么棧的壓入順序一定的情況下卻可以有不同的彈出順序,就是在棧的壓入過程中可以向外彈元素,不一定是全部元素進棧才開始向外彈棧,所以會產生不同的彈棧順序。
1.題目給的是ArrayList,使用這個作為輔助空間
然后就是借助一個輔助空間,將壓棧的序列儲存起來,儲存過程中判斷是否和彈棧序列一致,如果一致就讓彈棧序列指向后一位,等壓棧序列全部進輔助空間后,在開始反向遍歷一次,因為題目說明沒有重復元素,所以進輔助空間過程中判斷過的元素可以重復判斷,不會出錯,遍歷過程中判斷是否和彈棧序列元素相等,相等就彈棧序列指向后一位,并且輔助空間也指向下一個元素,不相等就只讓輔助空間指向下一個元素,這樣反向遍歷完輔助空間后如果彈棧序列沒有走到最后,就說明不是正確的彈棧序列,如果走到了最后就是正確序列。
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length == 0 || popA.length == 0)
return false;
int i = 0; //指向壓棧序列的指針
int j = 0; //指向彈棧序列的指針
ArrayList helpList = new ArrayList<>(); //儲存壓棧序列的輔助空間
while(i < pushA.length){ //第一次遍歷把壓棧序列放入輔助空間中
helpList.add(pushA[i]);
if(helpList.get(i) == popA[j]){ //如果有相等的就讓彈棧序列指針++。
j++;
}
i++;
}
i = i-1; //這里是細節,最后i=pushA.length所以要-1.
while(i>= 0 && j < popA.length){ //i>=0也是細節,如果只是大于0,0位置的元素就沒辦法判斷了。
if(helpList.get(i)== popA[j]){
i--;
j++;
}else{
i--;
}
}
return j == popA.length ? true:false; //根據彈棧序列的指針是否走到最后判斷是不是彈棧序列。
}
}
2: 使用Stack
使用棧結構的好處就是可以省去上面方法過程中的重復判斷,因為可以判斷到一個相等就直接彈出。
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length == 0 || popA.length == 0)
return false;
Stack temp = new Stack<>();
int popIndex = 0;
for(int i = 0 ; i < pushA.length; i++){
temp.push(pushA[i]);
while(!temp.isEmpty() && temp.peek() == popA[popIndex]){
temp.pop();
popIndex++;
}
}
return temp.isEmpty();
}
}
方法2參考:Alias
總結
以上是生活随笔為你收集整理的java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java数组螺旋矩阵从上到下_Java-
 - 下一篇: Win10系统提示“内存不能为read”