题目描述:
定义栈的数据结构,要求添加一个Min函数,能够得到当前栈中的最小元素。
要求函数min,push,pop的时间复杂度都是O(1).
思路:另外用一个最小栈做辅助结构,记录栈中的最小元素。元素栈中保存要入栈的元素。最小栈保存当前的最小元素。
具体过程如下:
1)、入栈时,先入元素栈,同时与最小栈顶元素比较,如果比栈顶元素小,则最小元素入最小栈,否则,栈顶元素入最小栈。
2)、出栈时,数据栈和最小栈同时出栈。
代码实现
#include<iostream>
#include<stack>
using namespace std;
template<class T>
class MinStack
{
public:
MinStack()
:_dataStack(),
_minStack()
{}
~MinStack()
{}
private:
stack<T> _dataStack;//用来存放数据的栈
stack<T> _minStack;//用来存放最小数的栈
public:
void Push(const T& data);
void Pop();
const T& Min();
};//错误!!类体外有分号
template<class T>
void MinStack<T>::Push(const T& data)
{
if(data == NULL)
{
cout<<"Argument can't null!"<<endl;
return;
}
if(_dataStack.size() == 0)
{
_dataStack.push(data);
_minStack.push(data);
}else{
//如果插入的数据小于当前最小值则更新最小值
if(data <= _minStack.top())
{
_minStack.push(data);
_dataStack.push(data);
}else{
_minStack.push(_minStack.top());
_dataStack.push(data);
}
}
}
template<class T>
void MinStack<T>::Pop()
{
if(_dataStack.size() == 0)
{
cout<<"Stack is empty,don't pop!"<<endl;
return;
}
_dataStack.pop();
_minStack.pop();
}
template<class T>
const T& MinStack<T>::Min()
{
if(_minStack.size() == 0)
{
cout<<"Stack is empty,don't get min!"<<endl;
return T();
}
return _minStack.top();
}
测试代码
#include<MinStack.hpp>//MinStack类所在的头文件
//测试Min栈的相关方法
void TestMinStack()
{
MinStack<int> minStack;
minStack.Push(3);
minStack.Push(4);
minStack.Push(1);
minStack.Push(2);
cout<<"min is:"<<minStack.Min()<<endl;
minStack.Pop();
minStack.Pop();
cout<<"min is:"<<minStack.Min()<<endl;
}
int main()
{
TestMinStack();
return 0;
}
运行结果