[整理III]微軟等100題系列V0.1版之三:棧、堆、隊列面試題集錦
July
==============
2.設計包含min函數的棧。
定義棧的資料結構,要求添加一個min函數,能夠得到棧的最小元素。
要求函數min、push以及pop的時間複雜度都是O(1)。
29.棧的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序列。
34.
實現一個隊列。
隊列的應用情境為:
一個生產者線程將int類型的數入列,一個消費者線程將int類型的數出列
35.
求一個矩陣中最大的二維矩陣(元素和最大).如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)寫出演算法;(2)分析時間複雜度;(3)用C寫出關鍵代碼
57.用倆個棧實現隊列。
題目:某隊列的聲明如下:
template<typename T> class CQueue
{
public:
CQueue() {}
~CQueue() {}
void appendTail(const T& node); // append a element to tail
void deleteHead(); // remove a element from head
private:
T> m_stack1;
T> m_stack2;
};
分析:從上面的類的聲明中,我們發現在隊列中有兩個棧。
因此這道題實質上是要求我們用兩個棧來實現一個隊列。
相信大家對棧和隊列的基本性質都非常瞭解了:棧是一種後入先出的資料容器,
因此對隊列進行的插入和刪除操作都是在棧頂上進行;隊列是一種先入先出的資料容器,
我們總是把新元素插入到隊列的尾部,而從隊列的頭部刪除元素。
66.顛倒棧。
題目:用遞迴顛倒一個棧。例如輸入棧{1, 2, 3, 4, 5},1在棧頂。
顛倒之後的棧為{5, 4, 3, 2, 1},5處在棧頂。
-----------------------------------------------------
1.關於本微軟等公司資料結構+演算法面試100題系列V0.1版的鄭重聲明
http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
2.完整100題,請參見,
[珍藏版]微軟等資料結構+演算法面試100題全部出爐[100題首次完整亮相]
http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx
3.更多詳情,請參見,本人部落格:
My Blog:
http://blog.csdn.net/v_JULY_v
4.所有的資源(題目+答案):
http://v_july_v.download.csdn.net/
5.本微軟等100題系列V0.1版,永久維護(網友,思路回複)地址:
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html
作者聲明:
本人July對本部落格所有任何內容和資料享有著作權,轉載請註明作者本人July及出處。
永遠,向您的厚道致敬。謝謝。July、二零一零年十二月十七日。