1. 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)时间复杂度为O(1)。
分析:设计两个栈,一个栈用来push 、pop操作,另一个栈用来保存当前最小值Min。当push元素小于等于Min栈顶元素时,将其压入Min栈顶,当pop元素等于Min栈顶元素时,两个栈均要pop出栈顶元素。下图为各种情况的优缺点分析。

class StackWithMin
{
public:
StackWithMin()
{}
~StackWithMin()
{}
void Push(const int& x)
{
s1.push(x);
if(s2.empty() || x <= s2.top())
{
s2.push(x);
}
}
void Pop()
{
assert(s1.size()>0 && s2.size()>0);
if(s1.top() == s2.top())
{
s2.pop();
}
s1.pop();
}
int Min()
{
assert(s1.size()>0 && s2.size()>0);
return s2.top();
}
private:
stack<int> s1;
stack<int> s2; //用于保存最下元素
};
2. 使用两个栈实现一个队列。
分析:一个栈用来push数据,一个栈用来pop数据。
图解

本文讨论了如何在O(1)时间复杂度内实现具有Push、Pop和Min功能的栈,以及如何用两个栈模拟队列,用两个队列实现栈,验证元素出栈、入栈顺序的合法性,以及在一个数组中实现两个栈的技巧和策略。
最低0.47元/天 解锁文章
1469

被折叠的 条评论
为什么被折叠?



