摘要:題目描述輸入兩個整數(shù)序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。指向壓棧序列的指針指向彈棧序列的指針儲存壓棧序列的輔助空間第一次遍歷把壓棧序列放入輔助空間中如果有相等的就讓彈棧序列指針。
1.題目描述
輸入兩個整數(shù)序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應(yīng)的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
2.思路首先要理解為什么棧的壓入順序一定的情況下卻可以有不同的彈出順序,就是在棧的壓入過程中可以向外彈元素,不一定是全部元素進(jìn)棧才開始向外彈棧,所以會產(chǎn)生不同的彈棧順序。
1.題目給的是ArrayList,使用這個作為輔助空間
然后就是借助一個輔助空間,將壓棧的序列儲存起來,儲存過程中判斷是否和彈棧序列一致,如果一致就讓彈棧序列指向后一位,等壓棧序列全部進(jìn)輔助空間后,在開始反向遍歷一次,因為題目說明沒有重復(fù)元素,所以進(jìn)輔助空間過程中判斷過的元素可以重復(fù)判斷,不會出錯,遍歷過程中判斷是否和彈棧序列元素相等,相等就彈棧序列指向后一位,并且輔助空間也指向下一個元素,不相等就只讓輔助空間指向下一個元素,這樣反向遍歷完輔助空間后如果彈棧序列沒有走到最后,就說明不是正確的彈棧序列,如果走到了最后就是正確序列。
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; //指向彈棧序列的指針 ArrayListhelpList = new ArrayList<>(); //儲存壓棧序列的輔助空間 while(i < pushA.length){ //第一次遍歷把壓棧序列放入輔助空間中 helpList.add(pushA[i]); if(helpList.get(i) == popA[j]){ //如果有相等的就讓彈棧序列指針++。 j++; } i++; } i = i-1; //這里是細(xì)節(jié),最后i=pushA.length所以要-1. while(i>= 0 && j < popA.length){ //i>=0也是細(xì)節(jié),如果只是大于0,0位置的元素就沒辦法判斷了。 if(helpList.get(i)== popA[j]){ i--; j++; }else{ i--; } } return j == popA.length ? true:false; //根據(jù)彈棧序列的指針是否走到最后判斷是不是彈棧序列。 } }
2: 使用Stack
使用棧結(jié)構(gòu)的好處就是可以省去上面方法過程中的重復(fù)判斷,因為可以判斷到一個相等就直接彈出。
import java.util.Stack; public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { if(pushA.length == 0 || popA.length == 0) return false; Stacktemp = 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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75592.html
摘要:假設(shè)壓入棧的所有數(shù)字均不相等。注意這兩個序列的長度是相等的思路借助一個輔助棧來存儲數(shù)據(jù)。當(dāng)所有數(shù)據(jù)入棧完成,如果出棧順序正確,那么輔助棧應(yīng)該為空。若存在,左右子樹,遞歸檢測左右子樹是否復(fù)合規(guī)范。 1.包含min函數(shù)的棧 定義棧的數(shù)據(jù)結(jié)構(gòu),請在該類型中實現(xiàn)一個能夠得到棧中所含最小元素的min函數(shù)(時間復(fù)雜度應(yīng)為O(1))。 思路 1.定義兩個棧,一個棧用于存儲數(shù)據(jù),另一個棧用于存儲每次數(shù)...
摘要:題目描述輸入兩個整數(shù)序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。 題目描述 輸入兩個整數(shù)序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應(yīng)的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的...
摘要:實際上是一個讓出線程的標(biāo)志遇到會立即返回一個狀態(tài)的。一個簡單的防抖函數(shù)如果定時器存在則清除重新開始定時執(zhí)行缺點只能在最后執(zhí)行,不能立即被執(zhí)行,在某些情況下不適用。假設(shè)壓入棧的所有數(shù)字均不相等。接收數(shù)據(jù)不受同源政策限制。 開始 盡管秋招還沒有拿到offer(好難過),但是一些知識點還是要總結(jié)的,既然自己選了這條路,那就一定要堅定不移的走下去...... 注意 new 運(yùn)算符的優(yōu)先級 fu...
摘要:劍指用兩個隊列實現(xiàn)一個棧聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處解題思路實現(xiàn)功能用兩個隊列實現(xiàn)一個棧,實現(xiàn),,和方法解題思路假設(shè)有隊列和實現(xiàn)棧的操作實現(xiàn)棧操作始終用來入隊實現(xiàn)實現(xiàn)棧的方法模擬棧的過程中,保證兩個隊列中始終有一個隊列為空,另一 劍指offer/LintCode494_用兩個隊列實現(xiàn)一個棧 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault....
摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。方法調(diào)用編寫的程序在進(jìn)行方法函數(shù)調(diào)用時,會完成對方法的壓棧操作,等方法執(zhí)行結(jié)束后,對應(yīng)的會完成對方法的彈棧操作。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)中的棧的概念、存儲結(jié)構(gòu)、棧的特點以及棧的適用場景,另外會穿插介紹面試中的一些經(jīng)典問題...
閱讀 2988·2021-11-16 11:45
閱讀 5188·2021-09-22 10:57
閱讀 1775·2021-09-08 09:36
閱讀 1602·2021-09-02 15:40
閱讀 2517·2021-07-26 23:38
閱讀 1203·2019-08-30 15:55
閱讀 929·2019-08-30 15:54
閱讀 1220·2019-08-29 14:06