题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1)。
碰见这个问题,我们的第一直觉就是用一个变量存储最小的元素,但是用一个变量够吗?答案是否定的。因为当我们得到最小的元素后如果要得到次小的元素呢?显然又傻了.所以我们需要一个辅助栈来保存栈内的每一时刻的最小元素。这样不管何时何地你想要都可以得到。不过要借助O(N)的辅助空间。下面以一个实例来分析,首先压入3,4,2,1之后接连两次弹出后栈顶元素再压入数字0,各个状态的数据占。辅助栈和最小值的状态。图示如下:
#include <iostream>
#include <stack>
using namespace std;
stack <int> s1_min; //辅助栈;
stack <int> s2_data; //数据栈;
void StackWithMinPush(int data) //辅助栈保存最小值;
{
s2_data.push(data);
if(s1_min.size()==0 || s1_min.top()>data)
s1_min.push(data);
else
{
s1_min.push(s1_min.top());
}
}
void StackWithMinPop()
{
s1_min.pop();
s2_data.pop();
}
int GetStackMin()
{
int min=s1_min.top();
return min;
}
int main()
{
int arr[4]={3,4,2,1};
for(int i=0;i<4;i++)
StackWithMinPush(arr[i]); //压入3,4,2,1;
StackWithMinPop();
StackWithMinPop();
StackWithMinPush(0);
cout<<GetStackMin()<<endl; //0
StackWithMinPop();
cout<<GetStackMin()<<endl;//3
system("pause");
return 0;
}
运行结果: