栈的出栈入栈时间复杂度为O(1),这个不难,对于返回值Min最小值得时间复杂度为O(1),我们可以借助一个辅助栈s2,来保存每次压栈时比栈s1的栈顶元素小的数。
1.如果栈s1和栈s2都是空栈,则将数据压入两个栈中。
2.再次压栈时将压入的数据与s2栈顶元素比较,如果比s2栈顶元素小或者等于则将此数据压入s1和s2中,反之只将此数据压入s1中。此时s2中的栈顶元素就是最小的。
3.pop()时如果s1和s2的相同,则s1和s2都pop(),否则只有s1.pop().
#include <stack>
template<class T>
class minstack
{
public:
minstack()
{}
~minstack()
{}
void push(const T& data)
{
s1.push(data);
if(s2.empty()||data<=s2.top())
{
s2.push(data);
}
}
void pop()
{
if(!s1.empty())
{
if(s1.top() == s2.top())
s2.pop();
s1.pop();
}
}
T min()
{
if(!s2.empty())
return s2.top();
return -1;
}
private:
std::stack<T> s1;
std::stack<T> s2;
};