每天一道劍指offer-棧的壓入、彈出序列

  • 2019 年 10 月 4 日
  • 筆記

前言

今天的題目 每天的題目見github(看最新的日期): https://github.com/gzc426 具體的題目可以去牛客網對應專題去找。

昨天的題解

題目

每天一道劍指offer-棧的壓入、彈出序列 來源:牛客網對應專題

題目詳述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

題目詳解

思路

  • 一個彈出序列,一個壓棧序列,彈出序列中的數,比如第一個彈出的數,肯定是在壓棧過程中彈出來的,所以在這裡新建一個棧stack,如果壓棧序列中要壓入的數和彈出序列當前的數不一樣(說明沒找到),那麼壓棧序列繼續壓,直到壓棧序列中找到了和彈出序列當前下標值相等的數,那麼彈出序列的下標值就+1,。
  • 結束條件就是彈出序列的下標值可以到達序列的末尾。

程式碼

import java.util.*;  public class Solution {      public boolean IsPopOrder(int [] pushA,int [] popA) {          if(pushA.length != popA.length)              return false;          Stack<Integer> stack1 = new Stack<>();//棧記錄壓棧          int j = 1;          stack1.push(pushA[0]);//棧中先壓入push壓棧序列的第一個數          for(int i=0;i<popA.length;i++)          {              while(j < pushA.length && stack1.peek() != popA[i])              {//如果棧頂的數和彈出序列不一樣,就一直壓棧,因為必須是從棧頂彈出的!                  stack1.push(pushA[j]);                  j++;              }              if(j >= pushA.length && stack1.peek() != popA[i])                  return false;//如果j已經到達壓棧序列的末尾,但是棧頂的數還是和彈出序列當前的數不一致                               //說明沒有這個序列              stack1.pop();          }          return true;      }  }

Tags: