(四)劍指offer 棧與佇列篇

2021-09-25 16:42:31 字數 2278 閱讀 9175

2.用兩個棧實現佇列

3.包含min函式的棧

4.棧的壓入、彈出序列

題目給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。

答案思路:

用佇列來存放滑動視窗裡邊的元素的下標,對佇列有一下操作:

(1)佇列的頭元素是這個佇列中最大的元素。

(2)每次放佇列中存放元素之前都要判斷,如果不比隊尾元素小,刪除隊尾元素,再存放。

(3)要判斷何時存放隊頭元素至結果集中,以及何時刪除隊頭元素。

/**

* 滑動視窗的最大值

* @param num

* @param size

* @return

*/public

static arraylist

maxinwindows

(int

num,

int size)

return result;

}

題目

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

答案思路:太簡單,就不說了。

stack

stack1 =

newstack

(); stack

stack2 =

newstack

();public

void

push

(int node)

public

intpop()

題目

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式(時間複雜度應為o(1))。

答案這道題也很簡單,主要是實現min函式查詢棧中的最小元素,且時間複雜度為1。對空間沒有要求,所以可以借助額外空間。

思路:定義兩個棧,datastackminstackdatastack用來儲存資料,minstack用來存放最小數。

每次使用push函式存放資料的時候,首先將資料放在datastack中,然後再判斷minstack棧頂元素是否小於或者等於當前要存放的資料,如果不是,則將資料存放minstack,如果是,則將minstack的棧頂元素再次存放道minstack中,確保datastackminstack的相同高度。

stack

datastack =

newstack

<

>()

; stack

minstack =

newstack

<

>()

;public

void

push

(int node)

else

}public

void

pop(

)public

inttop()

public

intmin()

題目

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

答案思路:

借用乙個輔助棧,將壓入序列逐一壓入棧,每壓入乙個元素,都用棧頂元素與彈出序列從頭比較,如果不相等則繼續壓入,如果相等,刪除棧頂元素,彈出序列向後移動一位,再繼續比較……

當整個程式結束,如果棧中還有元素,則該彈出序列不是這個棧的彈出序列,反之則是。

/**

* 棧的壓入、彈出序列

* @param pusha

* @param popa

* @return

*/public

boolean

ispoporder

(int

pusha,

int[

] popa)

}return stack.

empty()

;}

棧和佇列 劍指offer

題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的 min函式。class solution def init self self.elem def push self,node def pop self return self.elem.pop def top self return...

《劍指offer》 佇列和棧

一 兩個棧實現乙個佇列 題目 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解題思路 用乙個棧來存,另乙個棧出。需要考慮的情況如下 class solution int pop else if stack1.size 0 出隊 res stack2.top sta...

劍指offer 佇列和棧操作

問題1 兩個棧實現佇列 class queue 出隊 int pop int temp s2.top if s2.empty s2.pop return temp private stack s1 stack s2 問題2 兩個佇列實現棧 class stack int pop int temp q...