題目:定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min、push以及pop的時間複雜度都是o(1)。
分析:這是google的一道面試題。
看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push進棧的元素最先出棧,這種思路設計的資料結構已經不是乙個棧了。在棧裡新增乙個成員變數存放最小元素(或最小元素的位置)。每次push乙個新元素進棧的時候,如果該元素比當前的最小元素還要小,則更新最小元素。
乍一看這樣思路挺好的。但仔細一想,該思路存在乙個重要的問題:如果當前最小元素被pop出去,如何才能得到下乙個最小元素?因此僅僅只新增乙個成員變數存放最小元素(或最小元素的位置)是不夠的。我們需要乙個輔助棧。每次push乙個新元素的時候,同時將最小元素push到輔助棧中(考慮到元素可能是複雜的資料型別,用位置將能減少空間消耗);每次pop乙個元素出棧的時候,同時pop輔助棧。
#include #includetemplate
class
cstackwithmin
virtual ~cstackwithmin(void
) {}
t& top(void
);
const t& top(void) const
;
void push(const t&value);
void pop(void
);
const t& min(void) const
;private
: deque
m_data; //
the elements of stack
dequem_minindex; //
the indices of minimum elements
};//
get the last element of mutable stack
template t& cstackwithmin::top()
//get the last element of non-mutable stack
template const t& cstackwithmin::top() const
//insert an elment at the end of stack
template void cstackwithmin::push(const t&value)}//
erease the element at the end of stack
template void cstackwithmin::pop()
//get the minimum element of stack
template const t& cstackwithmin::min() const
步驟 資料棧 輔助棧 最小值
1.push 3 3 0 3
2.push 4 3,4 0,0 3
3.push 2 3,4,2 0,0,2 2
4.push 1 3,4,2,1 0,0,2,3 1
5.pop 3,4,2 0,0,2 2
6.pop 3,4 0,0 3
7.push 0 3,4,0 0,0,2 0
另一道題目:用兩個棧實現乙個佇列的功能。
要求給出演算法和思路!
答:設2個棧為a,b, 一開始均為空.
入隊:若a有空間,將新元素push入棧a;
若a滿則判斷b是否有元素,有則無法進佇列;若無則將棧a中所有元素依次pop出並push到棧b,將新元素push進a
出隊:(1)判斷棧b是否為空;
(2)如果不空,則b的棧頂元素出棧;如果為空,則將棧a中所有元素依次pop出並push到棧b;
(3)將棧b的棧頂元素pop出;
兩個棧都是空時隊列為空
這樣實現的隊列入隊和出隊的平攤複雜度都還是o(1)。
templateclasscqueue
~cqueue() {}
t deletehead(); //
remove the front element from head and return it
bool
isempty();
private
: stack
m_stack1;
stack
m_stack2;
};//
true if the queue has no elements
templatebool cqueue::isempty()//
//delete the head from the queue and return it
templatet cqueue
::deletehead()
}//push the element into m_stack2
assert(m_stack2.size() > 0
); t data =m_stack2.top();
m_stack2.pop();
return
data;
}
包含min函式的棧和兩個棧實現乙個佇列
題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 分析 這是google的一道面試題。看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push進棧的...
js 包含min函式的棧 包含min函式的棧
目標 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的 min 函式在該棧中,呼叫 min push 及 pop 的時間複雜度都是 o 1 設計思路 我們要做的是在我們每次資料入棧的時候,記錄當前資料棧中最小值,並且在pop 出棧之後依然能找到最小值 方案 如果只用乙個 min 變數來儲...
包含min函式的棧
題目描述 定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 n代表將要輸入的操作的步驟數。接下來有n行,每行開始有乙個字母ci。ci s 時,接下有乙個數字k,代...