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数据。
图解
实现