1. 程式人生 > >【棧佇列】實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)

【棧佇列】實現一個棧Stack,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值的操作)的時間複雜度為O(1)

問題分析

要記錄從當前棧頂到棧底元素的最小值,很容易想到用一個變數,每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; }