题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
解题思路:
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍看这样思路挺好。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置,考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
#include<iostream>
using namespace std;
#define M 100
class Stack
{
private:
int data[M];
int Index[M];
int top;
public:
Stack();
bool push(Stack &s, int value);
bool pop(Stack &s);
bool min(Stack &s,int &m);
};
int main()
{
Stack s;
int m=0;
s.push(s,3);
s.min(s,m);
s.push(s,4);
s.min(s,m);
s.push(s,2);
s.min(s,m);
s.push(s,1);
s.min(s,m);
s.pop(s);
s.min(s,m);
s.pop(s);
s.min(s,m);
s.push(s,0);
s.min(s,m);
return 0;
}
Stack::Stack()
{
top=-1;
//memset(Index,-1,sizeof(Index)); //这个函数通常为新申请的内存做初始化工作
}
bool Stack::push(Stack &s,int value)
{
if(s.top>=M)
return false;
s.data[++s.top]=value;
if(s.top==0)
s.Index[s.top]=0;
else if(value<s.data[s.Index[s.top-1]])
s.Index[s.top]=s.top;
else
s.Index[s.top]=s.Index[s.top-1];
return true;
}
bool Stack::pop(Stack &s)
{
if(s.top<0)
return false;
//s.Index[s.top]=-1;
--s.top;
return true;
}
bool Stack::min(Stack &s,int &m)
{
if(s.top<0)
return false;
m=s.data[s.Index[s.top]];
cout<<m<<" ";
return true;
}