棧和佇列面試題總結

2021-06-18 17:49:08 字數 1036 閱讀 4843

1. 在o(1)時間內實現棧的push、pop、min操作

分析:push和pop操作都很好做到,但是min操作就沒這麼容易了,首先想到的肯定是設定乙個flag在每次push的時候紀錄下最小值,但是考慮一下如果pop的時候正好pop掉了最小值怎麼辦呢?

解決:使用兩個stack,乙個存放資料,另乙個存放每次push後的最小值,這樣當pop資料的時候,若是正好是最小值,則將stack2也pop掉。

巧妙:於是對於上一題目,我把乙個棧當成兩個用,就是說,每次push,先入棧當前元素,然後入棧當前棧中最小元素;pop則每次彈出2個元素。

2. 用兩個stack實現乙個queue

解決:乙個stack1存放enqueue的資料,另乙個stack2存放stack1的反轉後的資料。每次enqueue存放入stack1中,dequeue從stack2中pop,當stack2為空的時候,將stack1中的元素pop放入stack2。

3. 用兩個queue實現stack

解決:pop時將queue1中的n-1個元素放入queue2中,在pop掉,push時存入不為空的那個queue中。

4. 棧的push、pop序列是否一致

輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。

比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是乙個pop系列。因為可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,這樣得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

解決:用模擬法,依次將arr1的元素push進棧,並檢查棧頂元素是否等於arr2的pop元素。

5. 乙個陣列實現兩個棧

解決:交叉索引,乙個棧下標0,2,4...另乙個1,3,5...或者兩個棧從不同方向增長

6. 乙個陣列實現三個棧

解決:交叉索引,兩個棧從不同方向增長,第三個從中間。

棧和佇列面試題

遞迴反轉乙個棧 void reverse stack s reverse s int tmp2 s.top s.pop reverse s s.push tmp1 reverse s s.push tmp2 遞迴排序乙個棧 void sort stack s sort s int tmp2 s.to...

棧和佇列面試題

1.使用兩個棧,實現乙個佇列。棧 先進後出,且只能從棧頂pop出資料。佇列 先進先出,對頭pop資料,隊尾push資料。如下 include template class myqueue void pop else if stack2.empty private stack stack1 stack...

棧和佇列面試題

採用順序棧實現棧基本操作 採用鏈式佇列實現佇列基本操作 define maxsize100 typedef int sdatatype typedef struct stack stack typedef struct minstack minstack void stackinit stack s...