劍指offer 棧 佇列類題目

2021-08-25 19:31:52 字數 1821 閱讀 1221

題目:

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

解析:題目中有兩個棧stack1和stack2,用來模擬佇列的操作,我是想把第乙個stack1作為資料儲存,第二個stack2作為中轉。佇列的特點是先進先出,

1:入隊操作,因為用stack1作為儲存,首先得判斷上一次stack2的資料又放回去沒,一進一出stack1剛好維持原有。

時間複雜度為o(n)。

2:出隊操作, 因為先進先出,那麼最開始進入佇列的元素肯定在棧底,所以可以將stack1的元素全部中轉到stack2,那麼在stack2中最上面的元素就是最開始入隊的元素。時間複雜度為o(n)。

**:

class solution

stack1.push(node);

}int pop()

int top = stack2.top();

stack2.pop();

return top;

}private:

stack

stack1; //作為儲存資料

stack

stack2; //進行中轉

};

題目描述

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

解析:

首先得定義乙個棧ss,然後在這個棧上定義操作。然後定義乙個輔助棧help,來維護入棧的所有元素的最小值,這個棧肯定是單調遞增的。然後對於棧的各種操作。

這樣取最小值的時間複雜度為o(1),我們採取了空間換時間的做法。

**:

class solution 

else

}void pop()

else ss.pop();

}int top()

int min()

};

題目描述

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

解析:可以使用棧進行模擬入棧出棧的操作,比如如果入棧以後,棧頂元素和popv的當前元素相同,說明這個序列可以出棧,直到當前入棧元素和popv的當前元素不相同為止,最後如果棧為空,說明出棧序列是合法的,如果不為空,那麼出棧序列就是不合法的。

**:

#include "stdafx.h"

#include

#include

#include

#include

using

namespace

std;

bool ispoporder(vector

pushv, vector

popv)

}cout

<< st.size() << endl;

return st.empty() ? true : false;

}int main()

; initializer_list lst2 = ;

vector

pushv(lst1);

vector

popv(lst2);

cout

<< ispoporder(pushv, popv);

return

0;}

棧和佇列 劍指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 棧和佇列相關題目 後序會補充

題目一 兩個棧實現乙個佇列 也就是利用棧的先進後出實現佇列的先進先出特性 這裡實現的介面有 入隊 出隊 基本思路 利用兩個棧實現佇列,也就是說利用棧的先進後出的規則實現佇列的先進先出 那麼,如圖 題目二 用兩個佇列實現棧思路 利用佇列的先進先出原則實現棧的先進後出 如圖 templateclass ...