定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,及pop的时间复杂度都是O(1)。
#include <stack>
#include <cassert>
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_min.top());
}
template<typename T> T& StackWithMin<T>::top(void)
{
return m_data.top();
}
template<typename T> const T& StackWithMin<T>::top(void)const
{
return m_data.top();
}
template<typename T> void StackWithMin<T>::pop(void)
{
assert(m_data.size()>0 && m_min.size()>0);
m_data.pop();
m_min.pop();
}
template<typename T> const T& StackWithMin<T>::min(void) const
{
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
template<typename T> bool StackWithMin<T>::empty(void) const
{
return m_data.empty();
}
template<typename T> size_t StackWithMin<T>::size(void) const
{
return m_data.size();
}
void test(char *str,StackWithMin<int>& stack, int expected)
{
cout << endl << str << endl;
if (stack.min() == expected)
{
cout << "successed" << endl;
cout << "top:" << stack.top() << endl;
cout << "min:" << stack.min() << endl;
}else{
cout << "failed" << endl;
cout << "top:" << stack.top() << endl;
cout << "min:" << stack.min() << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
StackWithMin<int> sm;
cout << "hello world" << endl;
sm.push(3);
test("test1",sm,3);
sm.push(4);
test("test2",sm,3);
sm.push(2);
test("test3",sm,2);
sm.pop();
test("test4", sm, 3);
sm.pop();
test("test5",sm,3);
sm.push(1);
test("test6",sm,1);
return 0;
}