31:棧的壓入很泊、彈出序列

題目31:棧的壓入、彈出序列

輸入兩個(gè)整數(shù)序列沾谓,第一個(gè)序列表示棧的壓入順序委造,請(qǐng)判斷二個(gè)序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等均驶。

舉例說(shuō)明

序列1,2,3,4,5是某棧的壓入順序昏兆,序列4,5,3,2,1是該壓棧序列對(duì)應(yīng)的一個(gè)彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列妇穴。(注意:這兩個(gè)序列的長(zhǎng)度是相等的)

思路

解決這個(gè)問(wèn)題很直觀的想法就是建立一個(gè)輔助棧爬虱,把輸入的第一個(gè)序列中的數(shù)字依次壓入該輔助棧,并按照第二個(gè)序列的順序依次從該棧中彈出數(shù)字腾它。

判斷一個(gè)序列是不是棧的彈出序列的規(guī)律:

  • 壓棧序列:int[] push
  • 彈出序列:int[] pop
  • 輔助棧:Stack<Integer> help = new Stack<>();
  • 判斷彈出元素是不是棧頂元素
    help.peek() != pop[nextPop]
  1. 如果Stack下一個(gè)彈出的數(shù)字剛好是棧頂數(shù)字跑筝,那么直接彈出
  2. 如果Stack下一個(gè)彈出的數(shù)字不在棧頂,把push[]中還沒(méi)有入棧的數(shù)字壓入help瞒滴,直到把下一個(gè)需要彈出的數(shù)字壓入棧頂為止
  3. 如果所有的數(shù)字都?jí)喝霔A?strong>仍然沒(méi)有找到下一個(gè)彈出的數(shù)字曲梗,那么該序列不可能是一個(gè)彈出序列

代碼實(shí)現(xiàn)

public class _31 {
    public static boolean isPopOrder(int[] push, int[] pop) {
        boolean isPossible = false;
        // a. 都不為空 b. 都有數(shù)據(jù),且數(shù)據(jù)個(gè)數(shù)都相等
        if (push != null && pop != null && push.length > 0 && push.length == pop.length) {
            Stack<Integer> help = new Stack<>();// 用于存放入棧時(shí)的數(shù)據(jù)
            int nextPush = 0;
            int nextPop = 0;

            while (nextPop < pop.length) { // 如果pop[] 沒(méi)有處理完就繼續(xù)進(jìn)行處理
                // a. 棧為空 b. 棧頂?shù)脑嘏c當(dāng)前處理的出棧元素不相同
                while (help.isEmpty() || help.peek() != pop[nextPop]) {
                    if (nextPush >= push.length) {//若入棧的元素已經(jīng)全部入棧了
                        break;//就退出內(nèi)層循環(huán)
                    }
                    //說(shuō)明沒(méi)被break。nextPush < push.length,還有push[] 可以入棧
                    help.push(push[nextPush]);// 將push[]元素 入 help棧
                    nextPush++;// 指向下一個(gè)要處理的入棧元素的位置
                }
                // 執(zhí)行到此處有兩種情況:
                // 第一種:在棧頂上找到了一個(gè)與入棧元素相等的元素
                // 第二種:在棧頂上沒(méi)有找到一個(gè)與入棧元素相等的元素虏两,但輸入棧的元素已經(jīng)全部入棧了
                // 對(duì)于第二種情況就說(shuō)彈出棧的順序是不符合要求的愧旦,退出外層循環(huán)
                if (help.peek() != pop[nextPop]) {
                    break;
                }
                help.pop();// 對(duì)應(yīng)到第一種情況:需要要棧的棧頂元素彈出
                nextPop++;// 指向pop[]下一個(gè)要處理的出棧元素的位置
            }

            // 執(zhí)行到此處有兩種情況
            // 第一種:外層while循環(huán)被break
            // 第二種:所有的出棧元素都被正確匹配

            // 對(duì)于出現(xiàn)的第一種情況其stack.isEmpty()必不為空,原因?yàn)榉治鋈缦拢?            // 所有的入棧元素一定會(huì)入棧碘举,但是只有匹配的情況下才會(huì)出棧,
            // 匹配的次數(shù)最多與入棧元素個(gè)數(shù)元素相同(兩個(gè)數(shù)組的長(zhǎng)度相等)搁廓,如果有不匹配的元素引颈,
            // 必然會(huì)使出棧的次數(shù)比入棧的次數(shù)少,這樣棧中至少會(huì)有一個(gè)元素
            // 對(duì)于第二種情況其stack.isEmpty()一定為空
            // 所以書(shū)本上的nextPop == pop.length(pNextPop-pPop==nLength)是多余的
            if (help.isEmpty()) {
                isPossible = true;
            }
        }
        return isPossible;
    }

    public static void main(String[] args) {
        int[] push = { 1, 2, 3, 4, 5 };
        int[] pop1 = { 4, 5, 3, 2, 1 };
        int[] pop2 = { 4, 3, 5, 1, 2 };

        System.out.println(isPopOrder(push, pop1));// true
        System.out.println(isPopOrder(push, pop2));// false
    }
}

輸出:

true
false

參考文章
圖解
【劍指Offer學(xué)習(xí)】【面試題22:棧的壓入境蜕、彈出序列】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝙场,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粱年,更是在濱河造成了極大的恐慌售滤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台诗,死亡現(xiàn)場(chǎng)離奇詭異完箩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拉队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門弊知,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人粱快,你說(shuō)我怎么就攤上這事秩彤。” “怎么了事哭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵漫雷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鳍咱,道長(zhǎng)降盹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任谤辜,我火速辦了婚禮澎现,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘每辟。我一直安慰自己剑辫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布渠欺。 她就那樣靜靜地躺著妹蔽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天蚓耽,我揣著相機(jī)與錄音锦秒,去河邊找鬼。 笑死掌测,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产园。 我是一名探鬼主播汞斧,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼什燕!你這毒婦竟也來(lái)了粘勒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屎即,失蹤者是張志新(化名)和其女友劉穎庙睡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體技俐,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乘陪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雕擂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂刘。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捂刺,靈堂內(nèi)的尸體忽然破棺而出谣拣,到底是詐尸還是另有隱情,我是刑警寧澤族展,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布森缠,位于F島的核電站,受9級(jí)特大地震影響仪缸,放射性物質(zhì)發(fā)生泄漏贵涵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一恰画、第九天 我趴在偏房一處隱蔽的房頂上張望宾茂。 院中可真熱鬧,春花似錦拴还、人聲如沸跨晴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)端盆。三九已至怀骤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焕妙,已是汗流浹背蒋伦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焚鹊,地道東北人痕届。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像末患,于是被迫代替她去往敵國(guó)和親研叫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容