棧的壓入、彈出序列

題目描述:

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

分析:

思路

【思路】借用一個(gè)輔助的棧,遍歷壓棧順序,先將第一個(gè)放入棧中,這里是1,然后判斷棧頂元素是不是出棧順序的第一個(gè)元素,這里是4,很顯然1≠4,所以我們繼續(xù)壓棧,直到相等以后開始出棧,出棧一個(gè)元素,則將出棧順序向后移動(dòng)一位,直到不相等,這樣循環(huán)等壓棧順序遍歷完成,如果輔助棧還不為空,說明彈出序列不是該棧的彈出順序。

舉例:
入棧1,2,3,4,5
出棧4,5,3,2,1
首先1入輔助棧,此時(shí)棧頂1≠4,繼續(xù)入棧2
此時(shí)棧頂2≠4,繼續(xù)入棧3
此時(shí)棧頂3≠4,繼續(xù)入棧4
此時(shí)棧4=4,出棧4,彈出序列向后一位,此時(shí)為5,,輔助棧里面是1,2,3
此時(shí)棧頂3≠5,繼續(xù)入棧5
此時(shí)棧頂5=5,出棧5,彈出序列向后一位,此時(shí)為3,,輔助棧里面是1,2,3
….
依次執(zhí)行,最后輔助棧為空。如果不為空說明彈出序列不是該棧的彈出順序。

代碼:

import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
      Stack<Integer> stack = new Stack<>();
        int k =0;
        for(int i =0;i<pushA.length;i++){
            int a = pushA[i];
            stack.push(a);
            for(int j=k;j<popA.length;j++){
                if(stack.peek()==popA[j]){
                    stack.pop();
                    continue;
                }else{
                    k=j;
                    break;
                }
            }
        }
        boolean result = stack.isEmpty()?true:false;
        return result;
    }
}
運(yùn)行結(jié)果
代碼優(yōu)化:

代碼可以寫的更加精簡(jiǎn):

public boolean IsPopOrder(int[] pushA, int[] popA) {
    int n = pushA.length;
    Stack<Integer> stack = new Stack<>();
    for (int pushIndex = 0, popIndex = 0; pushIndex < n; pushIndex++) {
        stack.push(pushA[pushIndex]);
        while (popIndex < n && stack.peek() == popA[popIndex]) {
            stack.pop();
            popIndex++;
        }
    }
    return stack.isEmpty();
}

小結(jié):

此題的重點(diǎn)在于思路,用一個(gè)棧來模擬壓入和彈出操作。按照入棧順序依次入棧,當(dāng)棧頂?shù)扔诔鰲P蛄械牡谝粋€(gè)元素時(shí),開始出棧,依次往后判斷,當(dāng)棧頂不等于出棧序列的相應(yīng)元素時(shí),停止出棧繼續(xù)入棧,入棧后判斷棧頂和出棧序列相應(yīng)元素是否相等,依次進(jìn)行下去,當(dāng)運(yùn)行結(jié)束時(shí)候,棧不為空,則出棧序列為非法的出棧序列。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 棧的壓入、彈出序列 題目描述 輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否為該棧的彈出順序。...
    echoVic閱讀 557評(píng)論 0 1
  • 輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均不相等。...
    鴻雁長(zhǎng)飛光不度閱讀 783評(píng)論 0 0
  • 題目描述輸入兩個(gè)整數(shù)序列,第一個(gè)序列表示棧的壓入順序,請(qǐng)判斷第二個(gè)序列是否為該棧的彈出順序。假設(shè)壓入棧的所有數(shù)字均...
    BeijingIamback閱讀 397評(píng)論 1 3
  • 數(shù)據(jù)在計(jì)算機(jī)中都是以補(bǔ)碼形式存放的,位運(yùn)算也是以一個(gè)數(shù)的補(bǔ)碼進(jìn)行運(yùn)算,結(jié)果也自然也是一個(gè)補(bǔ)碼,這點(diǎn)在分析計(jì)算過程時(shí)...
    SharpChen閱讀 816評(píng)論 0 4
  • 涂涂從小就很喜歡畫畫,只是喜歡,但不會(huì)畫。 但在她的生命中遇到了一個(gè)重要的人,阿火。 初中的時(shí)候是同級(jí)生兼室友,上...
    敬千帆閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容