2、设计包含min函数的栈

来源:互联网 发布:unity3d 录屏 编辑:程序博客网 时间:2024/06/06 19:29

要求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;

}

0 0