具有max函数的std :: stack <int>?

时间:2015-12-01 21:16:41

标签: c++ algorithm

如何使用max函数实现stack<int>,其中max函数的复杂度为O(1)并且它使用O(n)额外内存?

3 个答案:

答案 0 :(得分:6)

这个想法是通过使用堆栈中的对来跟踪最大值。如果您在堆栈中插入内容,则相应地更新最大值。

class Stack {
private: 
    stack<pair<int,int>> s;

public:
    bool empty() const {
        return s.empty();
    }

    int max() const {
        assert (empty() == false);
        return s.top().second;
    }

    int pop() {
        int ans = s.top().first;
        s.pop();
        return ans;
    }

    void push(int x) {
        if (s.empty() || x > s.top().second)
        {
            s.emplace(x, x);
        }
        else
        {
            s.emplace(x, s.top().second);
        }
    }
};

答案 1 :(得分:2)

维护已排序list int

每个堆栈节点都指向list条目

max只返回min

的头部(list将是尾部)

push同时对list 进行排序插入时(请注意,现在这将是O(n)但不排除) < / p>

当您pop删除list

中的相关条目时

获得头部是O(1)。 list的大小为O(n)。

答案 2 :(得分:2)

您可以在结构中保留2个堆栈,其中一个用作普通堆栈。另一个用于最大值存储(让我们称之为max_stack)。

如果推送的值大于或等于max_stack顶部的值,您只想在max_stack中推送一个值。如果从普通堆栈弹出的值等于max_stack的顶部,您只想弹出max_stack。因此top max_stack始终保持当前堆栈中的最大值。

例如: 推入2,1,2,1,3,2,3,max_stack看起来像2,2,3,3。