日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)

發(fā)布時(shí)間:2023/12/15 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.題目描述

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

2.思路

首先要理解為什么棧的壓入順序一定的情況下卻可以有不同的彈出順序,就是在棧的壓入過程中可以向外彈元素,不一定是全部元素進(jìn)棧才開始向外彈棧,所以會(huì)產(chǎn)生不同的彈棧順序。

1.題目給的是ArrayList,使用這個(gè)作為輔助空間

然后就是借助一個(gè)輔助空間,將壓棧的序列儲(chǔ)存起來,儲(chǔ)存過程中判斷是否和彈棧序列一致,如果一致就讓彈棧序列指向后一位,等壓棧序列全部進(jìn)輔助空間后,在開始反向遍歷一次,因?yàn)轭}目說明沒有重復(fù)元素,所以進(jìn)輔助空間過程中判斷過的元素可以重復(fù)判斷,不會(huì)出錯(cuò),遍歷過程中判斷是否和彈棧序列元素相等,相等就彈棧序列指向后一位,并且輔助空間也指向下一個(gè)元素,不相等就只讓輔助空間指向下一個(gè)元素,這樣反向遍歷完輔助空間后如果彈棧序列沒有走到最后,就說明不是正確的彈棧序列,如果走到了最后就是正確序列。

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; //指向彈棧序列的指針

ArrayList helpList = new ArrayList<>(); //儲(chǔ)存壓棧序列的輔助空間

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ù)判斷,因?yàn)榭梢耘袛嗟揭粋€(gè)相等就直接彈出。

import java.util.Stack;

public class Solution {

public boolean IsPopOrder(int [] pushA,int [] popA) {

if(pushA.length == 0 || popA.length == 0)

return false;

Stack temp = 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

總結(jié)

以上是生活随笔為你收集整理的java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。