定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,要求函数min,push及pop的时间复杂度都是O(1)
栈的数据结构包含两个普通栈,一个栈存数据,另一个栈存最小值(或最小值的位置,如果用stl里的栈,则不能存最小值的位置,因为stl里的stack不支持下标索引访问)。
#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;
template <typename T>
class StackWithMin
{
private:
stack<T> datastack;
stack<T> minstack;//存最小值而不是最小值的下标
public:
void push(const T &data)
{
datastack.push(data);
if(0==minstack.size())
minstack.push(data);
else if(minstack.top()>data)
minstack.push(data);
else
minstack.push(minstack.top());
}
void pop()
{
assert(datastack.size()>0);
assert(minstack.size()>0);
datastack.pop();
minstack.pop();
}
int& min()
{
return minstack.top();
}
};
void main()
{
StackWithMin<int> s;
s.push(10);
s.push(7);
s.push(3);
s.push(3);
s.push(8);
s.push(5);
s.push(2);
s.push(6);
for(int i=0; i<8; i++)
{
cout<<s.min()<<endl;
s.pop();
}
}