【棧佇列】實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)
阿新 • • 發佈:2019-02-19
問題分析
要記錄從當前棧頂到棧底元素的最小值,很容易想到用一個變數,每push一個元素更新一次變數的值。那麼問題來了,當執行pop操作時,上一次的最小值就找不到了。
解決方法
方法1、
使用一個棧。元素x入棧時,執行一次push(x),再push(min),min表示當前棧頂到棧底元素最小值;元素出棧時,執行兩次pop()
看上圖中的例子,藍色的為最小值,
push:先比較當前棧頂的最小值與插入的值,記錄兩個中的最小值,先push 插入值,再push記錄的最小值。
pop:pop 兩次
getmin:top棧頂的值。
方法2、
使用兩個棧,一個棧s,儲存push的值,另一個棧作為輔助棧,儲存當前最小值
push : 棧s插入值push(data),輔助棧min,如果為空或者插入的值data小於等於輔助棧的棧頂元素,輔助棧也插入data。
pop:棧s pop操作,輔助棧中的棧頂元素如果等於棧s的棧頂的話也執行pop操作。
getmin:獲取min棧的棧頂元素。
template<class T>
class StackWithMin
{
public:
StackWithMin()
{}
void Push(T data)
{
s.push(data);
if (minStack.empty() || minStack.top() >= data)
minStack.push(data);
}
void Pop()
{
if (s.top() == minStack.top())
minStack.pop();
s.pop();
}
T& MinData()
{
if (!minStack.empty())
return minStack.top();
}
private:
stack<T> s;
stack<T> minStack;
};
void Test3()
{
StackWithMin<int > min_stack;
min_stack.Push(1);
min_stack.Push(2);
min_stack.Push(3);
min_stack.Push(4);
cout << min_stack.MinData() << endl;
}