实现一个栈,要求实现push,pop,min(返回最小值)的时间复杂度均为O(1)
思路:使用两个栈,一个是datastack,用来存放每次push进的数据,而另一个是minstack,专门存放当前的最小值。
压栈:如果datastack为空或插入的值小于minstack中的栈顶元素,说明该值是最小值,所以向两个栈中都插入该值;至于其他情况,说明该值不是最小值,所以将该值插入datastack,而将minstack的栈顶元素再插一遍进minstack,保证minstack的栈顶元素始终是最小值。
出栈:两个栈同时出栈,保证两个栈的元素个数始终保持相等;返回datastack的栈顶元素;
取最小值;直接返回minstack的栈顶元素即可。
class MinStack {
public:
stack<int> minstack;
stack<int> datastack;
int ret = 0;
MinStack() {
// do initialization if necessary
}
void push(int number) {
// write your code here
if(datastack.empty() || number < minstack.top())
{
datastack.push(number);
minstack.push(number);
}
else
{
datastack.push(number);
minstack.push(minstack.top());
}
}
int pop() {
// write your code here
ret = datastack.top();
datastack.pop();
minstack.pop();
return ret;
}
int min() {
// write your code here
return minstack.top();
}
};