题意:
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
思路:
拿空间换时间。
定义两个栈,
一个进行普通的数据插入和删除操作;
一个用来存储最小值的变化。
eg:
两个栈stack1和stack2,
stack1进行插入删除操作, stack2记录最小值的变化。
现有一组数[3, 2, 4, 1, 5],栈开始都为空,
第一步,将3插入stack1中,然后用3与stack2中的栈顶元素比较,stack2为空,直接插入,
此时stack1:[3], stack2:[3];
第二步,将2插入stack1中, 然后用2与stack2中的栈顶元素比较, (2<3),所以将2插入stack2,
此时stack1:[3,2],stack2:[3,2];
第三部,将4插入stack1, 然后用4与stack2中的栈顶元素比较, (4>2),所以4不插入stack2,
此时stack1:[3,2,4],stack2:[3,2];
……以此类推
删除的时候先删除stack1中的栈顶元素,然后将删除的元素与stack2的栈顶元素比较,相同的话将stack2的栈顶元素也删除,否则不做操作。
代码如下:
template <class T>
class Stack
{
public:
Stack(int len=100);
T Min();
T Pop();
void Push(T val);
private:
T top1,top2;
T *stack1,*stack2; //stack2用来存储最小值的栈
};
template <class T>
Stack<T>::Stack(int len)
{
top1 = top2 = -1;
stack1 = new T[len] ;
stack2 = new T[len] ;
}
template <class T>
T Stack<T>::Min()
{
return stack2[top2];
}
template <class T>
T Stack<T>::Pop()
{
T temp = stack1[top1--] ;
if(stack2[top2] == temp)
top2--;
return temp;
}
template <class T>
void Stack<T>::Push(T val)
{
stack1[++top1] = val ;
if(top2 == -1)
stack2[++top2] = val;
else if(val <= stack2[top2])
stack2[++top2] = val ;
}