思路:
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。但是仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的,因为如果当前最小元素被pop出去,如何才能得到下一个最小元素?所以我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
参考代码:
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <iostream>
#include <stack>
using namespace std;
class sTack
{
private:
stack<int>datestack;
stack<int>minstack;
public:
void push(int k)
{
datestack.push(k);
if(!minstack.size())
minstack.push(k);
else if(k<=minstack.top())
minstack.push(k);
}
void pop()
{
assert(datestack.size()>0);
assert(minstack.size()>0);
if(datestack.top()==minstack.top())
minstack.pop();
datestack.pop();
}
int min()
{
return minstack.top();
}
int top()
{
return datestack.top();
}
};
int main()
{
sTack T;
T.push(2);
T.push(6);
T.push(3);
T.push(1);
T.push(3);
T.push(5);
T.push(4);
T.push(2);
for(int i=0;i<8;i++)
{
cout<<T.min()<<endl;
T.pop();
}
return 0;
}