定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
#include <deque>
#include <assert.h>
#include <iostream>
using namespace std;
template<typename T>
class MyStack
{
private:
deque<T> m_data;
deque<size_t> m_minIndex;
public:
//构造函数
MyStack()
{
}
//析构函数
virtual ~MyStack()
{
}
//判空
int isEmpty()
{
return m_data.size();
}
//返回栈顶元素
T &top()
{
return m_data.back();
}
//返回栈顶元素
const T &top() const
{
return m_data.back();
}
//入栈
void push(const T &value)
{
m_data.push_back(value);
if(m_minIndex.size() == 0)
{
m_minIndex.push_back(0);
}
else
{
if(value < m_data[m_minIndex.back()])
{
m_minIndex.push_back(m_data.size()-1);
}
else
{
m_minIndex.push_back(m_minIndex.back());
}
}
}
//出栈
void pop()
{
m_data.pop_back();
m_minIndex.pop_back();
}
//返回最小值
const T &min() const
{
assert(m_data.size()>0);
assert(m_minIndex.size()>0);
return m_data[m_minIndex.back()];
}
};
int main(int argc,char **argv)
{
MyStack<int> s;
s.push(3);
s.push(1);
s.push(4);
s.push(2);
//打印栈
while(s.isEmpty())
{
cout << s.top()<< " 出栈" <<endl;
s.pop();
cout << "最小值:"<<s.min()<<endl;
}
}