栈和队列最常考的面试题之一: 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
主要思路:
1)建立两个栈_data与_mindata,其中_data作为数据栈,存放每一个入栈的数据;_mindata作为数据最小栈,存放数据栈中当前最小的数据;
2)当元素data入栈时,将data入栈到_data数据栈中,并让data与_data的栈顶元素做比较,如果x小于等于_data的栈顶元素,则将data入栈到_mindata最小数据栈中;
3)当元素出栈时,让_data与_mindata的栈顶元素做比较,如果栈顶元素相等,则将_data与_mindata的栈顶元素同时出栈,否则只让_data数据栈的栈顶元素出栈;
4)当求栈中最小元素时,直接让最小元素栈的栈顶元素出栈。
废话少说,直接上代码啦!!
#include <iostream>
#include <stack>
using namespace std;
template <class T>
class MinStack
{
public:
void Push(const T& data)
{
_data.push(data);
if(_mindata.empty() || data <= _mindata.top())
{
_mindata.push(data);
}
}
void Pop()
{
if(_data.empty())
{
return;
}
if(!_data.empty() && _data.top() == _mindata.top())
{
_mindata.pop();
}
_data.pop();
}
const T Min()
{
if(_mindata.empty())
{
return T();
}
return _mindata.top();
}
void Print()
{
while(!_data.empty())
{
cout<<_data.top()<<" ";
_data.pop();
}
cout<<endl;
}
protected:
stack<T> _data, _mindata;
};