栈在O(1)时间内求min值

实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)

思路:1:在stack的数据结构中加两个个字段,如 

typedef struct { 


       int data[MAX];   // 存储栈中的所有数

       int top;   // 存储栈顶元素在data数组中的位置

       int min;  // 最小值

       int second;  // 次小值

}stack; 

pop,push的时候都去栈顶元素,所以是O(1) 

min的时候取stack的min字段,所以也是O(1) 

每次push的时候进行比较,如果当前push的元素比stack->min小,则用当前元素替换stack->min,用原来的min替换second。如果当前push的元素比stack->min大,但比second小,则用当前元素替换stack->second。于是达到了取min的效果,程序如下 

int push(stack * s,int x){ 

       ASSERT(s!=NULL); 

       if(s->top>=MAX) // 防止栈溢出

       { 

              printf("Stackoverload!"); 

              return -1; 

       } 

       s->data[s->top++]=x;  // push的基本功能,把x压入栈,栈顶元素的位置自增1

       if(x < s->min)  // 如果新压入的x比当前min小,则替换min
s->second = s->min; 
              s->min=x; 



       else if(x< s->second) // 否则,如果x还比second小,这替换second



              s->second= x;
// 否则,minsecond都不变
       return 0; 


每次pop的时候进行比较,如果pop的元素为min,则用second替换min(这里用到了second)。于是达到了取min的效果,程序如下 
int pop(stack *s,int *x) 



       ASSERT(s!=NULL); 

       if(s->top<=0) 

       { 

              printf("StackEmpty!"); 

              return -1; 

       } 

       (*x) =s->data[s->top--];   // pop的基本功能,把x出栈,栈顶元素的位置自减1
       if(x==s->min)  // 如果x正好等于min,那么就要把secondmin

              s->min=s->second; 
       return 0; 



int min( stack *s,int *x ) 



       ASSERT(s!=NULL); 

       (*x)=s->min; 

       return 0; 



 思路2:设置辅助栈ass,记录每个状态下的最小值,每次插入时,得到辅助栈当前值,和插入的值比较

如果小则插入到最小值栈的就是它,否则就是原来的最小值,通过这种方式,pop,push,min三个都是

O(1)算法的。 

    如果还需要求最大值,那么就另外再设置一个ass2来记录当前栈的最大值。

typedef struct { 

int data[MAX]; 

int top; 

}stack; 

STATIC int push_stack(stack *s,int x) 



ASSERT((s!=NULL)); 

if(s->top>=MAX) 



printf("Stack overload"); 

return -1; 



s->data[s->top++]=x; 

return 0; 



STATIC int pop_stack(stack *s,int *x) 



ASSERT(s!=NULL); 

if(s->top<=0) 



printf("Stack Empty"); 

return -1; 



(*x)=s->data[s->top--]; 

return 0; 



int push(stack *main,stack *ass,int x) 



ASSERT((main!=NULL)&&(ass!=NULL)); 

int temp; 

pop_stack(ass,&temp); 

push_stack(main,x); 

if(x<temp) 



push_stack(ass,temp); 

push_stack(ass,x); 



else 



push_stack(ass,temp); 

push_stack(ass,temp); 



return 0; 



int pop(stack *main,stack *ass,int *x) 



ASSERT((main!=NULL)&&(ass!=NULL)); 

int temp; 

pop_stack(ass,&temp); 

pop_stack(main,x); 

return 0; 



int min(stack *ass,int *x) 



ASSERT((main!=NULL)&&(ass!=NULL)); 

pop_stack(ass,x); 

push_stack(ass,(*x)); 

return 0; 
}

栈在O(1)时间内求min值

标签:   数据结构   最小值   o1   

原文地址:http://blog.csdn.net/puqutogether/article/details/43916945



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值