題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。java
假設壓入棧的全部數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列,4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。.net
解決這個問題很直觀的想法就是創建一個輔助棧,把輸入的第一個序列中的數字依次壓入該輔助棧,並按照第二個序列的順序依次從該棧中彈出數字。指針
以彈出序列4,5,3,2,1爲例分析壓棧和彈出的過程。第一個但願 被彈出的數字是4,所以4須要先壓入到輔助棧裏面。壓入棧的順序由壓棧序列肯定了,也就是在把4壓入進棧以前,數字1,2,3都須要先壓入到棧裏面。此時 棧裏面包含4哥數字,分別是1,2,3,4,其中4位於棧頂。把4彈出棧後,剩下的三個數字是1,2,3.接下來但願被彈出的數字是5,因爲它不是棧頂的 數字,所以咱們接着在第一個序列中巴4之後的數字壓入輔助棧中,直到壓入了數字5.這個時候5位於棧頂,就能夠被彈出來了。接下來但願被彈出的三個數字依 次是3,2,1.因爲每次操做前他們都位於棧頂,所以直接彈出便可。下表描述了本例中入棧和出棧的過程。get
總結上述入棧、出棧的過程,咱們可疑找到判斷一個序列是否是棧的彈出 順序的規律:若是下一個彈出的數字恰好是棧頂數字,那麼直接彈出。若是下一個彈出的數字不在棧頂,咱們把壓棧序列中尚未入棧的數字壓入輔助棧,知道把下 一個須要彈出的數字壓入棧頂爲止。若是全部的數字都壓入棧了仍沒有找到下一個彈出的數字,那麼該序列不多是一個彈出序列。class
造成清晰的思路後,咱們能夠些代碼了,下面是Java代碼的實現。import
package cglib;List
import java.util.ArrayList;
import java.util.Stack;im
public class DeleteNode {
public boolean IsPopOrder(ArrayList<Integer> pushA,ArrayList<Integer> popA) {
if(pushA.size()!=popA.size()){
return false;
}
Stack<Integer> stack = new Stack<Integer>(); //建立一個輔助的堆棧
int j=0; //定義一個指向彈出序列第一位的指針
for(int i=0;i<pushA.size();i++){
stack.push(pushA.get(i)); //對於壓入序列,每一個數壓入輔助棧中,每當壓入一個數進行判斷
while((!stack.empty())&&(stack.peek()==popA.get(j))){
stack.pop();
j++; //棧頂元素與彈出序列指針所指的數進行比較,若相同則彈棧,同時指針後移一位,直到棧頂元素與指針所指元素不一樣,則壓入下一個壓入序列中的數
}
}
if(stack.empty()){
return true; //最終若輔助棧爲空說明彈出序列爲壓入序列的彈出順序。
}else{
return false;
}
}
public static void main(String[] args){
ArrayList<Integer> pushA = new ArrayList<Integer>();
pushA.add(1);
pushA.add(2);
pushA.add(3);
pushA.add(4);
pushA.add(5);
ArrayList<Integer> popA = new ArrayList<Integer>();
popA.add(4);
popA.add(5);
popA.add(3);
popA.add(2);
popA.add(1);
DeleteNode s = new DeleteNode();
boolean res = s.IsPopOrder(pushA, popA);
System.out.println(res);
}總結
輸出static
true