題目:
用兩個棧來實現乙個佇列,完成佇列的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 ...