劍指Offer(Java版):棧的壓入、彈出序列

題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。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

相關文章
相關標籤/搜索