您的位置:首页 > 运维架构

栈--实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)

2017-07-19 09:56 561 查看
思路:给一个辅助栈,辅助栈栈顶就为最小的元素,当有新元素进来时与辅助栈的栈顶作比较,如果新来的比辅助栈的栈顶小,就把新来的给辅助栈。

template<class T>
class StackWithMin
{
public:
StackWithMin()
{}
~StackWithMin()
{}
public:
void push(const T& value)
{
//无论如何都要先把value给data
s_data.push(value);
//如果辅助栈是空或者辅助栈的栈顶还比value大,则把value压入辅助栈
if (s_min.size() == 0 || s_min.top() > value)
s_min.push(value);
else
s_min.push(s_min.top());
}

void pop()
{
//将两个栈都pop即可,因为如果栈中的值大于辅助栈栈顶,则还是会向辅助栈push最小的,所以这就可能导致辅助栈同时出现很多最小的元素。
assert(s_data.size() > 0&& s_min.size() > 0);
s_data.pop();
s_min.pop();
}

const T& Min()const
{
//直接取辅助栈顶的即可
assert(s_data.size() > 0&&s_min.size()>0);
return s_min.top();
}

private:
stack<T> s_data;
stack<T> s_min;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pop 剑指offer
相关文章推荐