实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小的操作数)的时间复杂度为o(1)
对于前两个要求许多人都能做出来,需要思考的是最后一个,返回最小的操作数,要注意在每次入栈出栈的操作完成后,最小数的改变必须考虑,尤其是在出栈操作顺序完成后,若是最小数被Pop,那么,如何获得当前的最小数等问题。
采用的方法是
定义两个栈:
将第一个数压栈,因为两个栈都为空 所以直接压栈
在压第n个数时,功能栈直接压栈,记录最小数栈,则须比较,如果栈顶数比第n数小,则将栈顶数再次压栈,否则,就将第n数压栈.
结果如下图:
出栈pop时,两个栈同时直接pop就可以了,min查找直接return mindata的栈顶元素即可。
代码如下:
class Solution {
public:
void push(int value) {
data.push(value);
if (mindata.empty() || value <= mindata.top())
mindata.push(value);
else
{
mindata.push(mindata.top());
}
}
void pop() {
data.pop();
mindata.pop();
}
int top() {
return data.top();
}
int min() {
return mindata.top();
}
private:
stack<int> data, mindata;
};