问题:实现一个栈,要求实现Push(入栈),Pop(出栈),Min(返回最小值)的操作时间复杂度为O(1).
分析:刚看到这个题的时候,用栈来实现Min(返回最小值)的操作,我的第一反应就是必须把栈中的最小值放在top()位置,然后根据栈的“后进先出”的道理来实现,但是问题接着就来了。首先,根据元素的不断push,最小值很有可能在不断更新啊,那么如何让最小值一直处于栈中top()位置呢?如果栈中为空或要压入的元素小于等于栈顶元素,那么这还好办,直接push进去就好了,在这里呢还有一个小问题,当我们要执行pop时,上一次的最小值就找不到了啊,所以呢,我们需要将其进行两次Push;如果我们遇到要Push的元素(d)大于栈顶元素,我们需要将栈中最小值先保存一份,在Push进元素d后再把这个最小值Push进去,由此就可以保证最小值一直处于top位置了。
下面是代码实现:
#include<assert.h>
#include<stack>
#include<iostream>
using namespace std;
template<typename T>
class Stack
{
public:
void Push(const T&