劍指 Offer 31. 棧的壓入、彈出序列
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 {1,2,3,4,5} 是某棧的壓棧序列,序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列,但 {4,3,5,1,2} 就不可能是該壓棧序列的彈出序列。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
輸出:true
解釋:我們可以按以下順序執行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
輸出:false
解釋:1 不能在 2 之前彈出。
提示:
- 0 <= pushed.length == popped.length <= 1000
- 0 <= pushed[i], popped[i] < 1000
- pushed 是 popped 的排列。
做題思路:
這道題主要是藉助輔助棧彈出序列索引,然後和彈出的的popped相互比較,相等的話,則彈出序列,不相等則繼續遍歷,直到把所有輔助棧的序列彈出,即可輸出true。但如果index==push.length的時候,就直接輸出false。
class Solution {
Stack<Integer> stack = new Stack<>();
public boolean validateStackSequences(int[] pushed, int[] popped) {
int index = -1;
for (int i = 0; i < popped.length; i++) {
while(stack.isEmpty()||stack.peek()!=popped[i]){
index++;
if(index==pushed.length){
return false;
}
stack.push(pushed[index]);
}
stack.pop();
}
return true;
}
}
這是k神更為簡潔的程式碼思路,強烈推薦好好學習借鑑下。
演算法流程:
- 初始化: 輔助棧 stackstack ,彈出序列的索引 ii ;
- 遍歷壓棧序列: 各元素記為 numnum ;
- 元素 numnum 入棧;
- 迴圈出棧:若 stack 的棧頂元素 == 彈出序列元素 popped[i] ,則執行出棧與 i++;
- 返回值: 若 stack為空,則此彈出序列合法。
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int i = 0;
for(int num : pushed) {
stack.push(num); // num 入棧
while(!stack.isEmpty() && stack.peek() == popped[i]) { // 迴圈判斷與出棧
stack.pop();
i++;
}
}
return stack.isEmpty();
}
}
參考連結: