要求O(1)时间push、pop和min函数
分析:
push和pop是O(1)的
若要求min也是O(1)的,那么在每次push时都应计算当前最小值。又因为是栈,所以每个栈元素项保存当前的min值。
push时有两种情况:
当前值 < 之前栈顶的min值 ===> 当前值是min值
当前值 > 之前栈顶的min值 ===> 之前栈顶的min值是min值
解:
栈数据结构设计:
struct 栈元素
{
int 当前值value;
int 最小值min;
};
struct 栈
{
int 栈允许的最大size;
int 栈顶top;
struct栈元素 *elments;
};
struct 栈 stack;
栈初始化:
init()
{
stack.size = 最大大小;
stack.top = 0;
stack.elments = malloc(size * 栈元素结构大小)
}
栈销毁:
destoy()
{
free(stack.elments);
}
push操作:
push(int d)
{
if(top达到size)
{
statck.elemnts = remalloc( (p指向旧的stack.elments), 2*stack.szie*栈元素结构大小);
stack.szie *= 2;
}
elments[satck.top]. value= d;
elemnts[stack.top].min = 第一个元素top==0? d : 前一个栈顶的min值elments[satck.top-1].mi
if (当前值d < 当前栈顶的min值)
elments[satck.top].min = d;
top++;
}
pop操作:
pop()
{
if(elments[satck.top].== 0)
error("栈空");
return elemnts[--stack.top].value;
}
min操作:
min()
{
if(elments[satck.top].== 0)
error("栈空");
return elemnts[stack.top - 1].min;
}