#include<iostream>
#include<stack>
using namespace std;
template <typename T> class StackWithMin
{
public:
StackWithMin(void) {}
virtual ~StackWithMin(void) {}
T& top(void);
const T& top(void) const;
void push(const T& value);
void pop(void);
const T& min(void) const;
bool empty() const;
size_t size() const;
private:
stack<T> m_data; // 数据栈,存放栈的所有元素
stack<T> m_min; // 辅助栈,存放栈的最小元素
};
template <typename T> void StackWithMin<T>::push(const T& value)
{
m_data.push(value);
if(m_min.size()>0||value<m_min.top())
m_min.push(value);
else
m_min.push(m_data.top());
}
template <typename T> void StackWithMin<T>::pop()
{
assert(m_data.size()>0&&m_min.size()>0);
/*
C++ assert()函数的作用是现计算表达式 expression ,如果其值为假(即为0),
那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
*/
m_data.pop();
m_min.pop();
}
template <typename T> const StackWithMin<T>::min()const
{
assert(m_data.size()>0&&m_min.size()>0);
return m_min.top();
}
//const T& top(void) const;
template <typename T> StackWithMin<T>::top()
{
return m_data.top();
}
template <typename T> const StackWithMin<T>::top()const
{
return m_min.top();
}
template <typename T> size_t StackWithMin<T>::size() const
{
return m_data.size();
}
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min
函数。在该栈中,调用min 、push pop的时间复杂度都是O(1)