实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值),要求时间复杂度为O(1) 。
可以借助两个栈来解决这个问题。一个栈用来存放栈的数据(其栈顶元素即为当前栈的),另外一个用来存放当前栈的最小元素。具体实现方法如下:
首先定义该栈:
typedef struct MinStack
{
SeqStack data; //该栈存放的是当前栈的栈顶元素
SeqStack min; //该栈存放的是当前栈最小元素
}MinStack;
当push元素时,取栈顶元素,若栈顶元素小于该元素,将栈顶元素push进min栈,否则将该元素push进栈。再将该元素push进data栈。
pop时,同时pop两个栈。
具体代码如下:
#include "seqstack.h" //最小栈 typedef StackType MinStackType; typedef struct MinStack { SeqStack data; //该栈存放的是当前栈的栈顶元素 SeqStack min; //该栈存放的是当前栈最小元素 }MinStack; void InitMinStack(MinStack* m); void PushMinStack(MinStack* m, MinStackType elem); void PopMinStack(MinStack* m);
#include "question.h" //最小栈 void InitMinStack(MinStack* m) { assert(m); InitSeqStack(&(m->data)); InitSeqStack(&(m->min)); return; } void PushMinStack(MinStack* m, MinStackType elem) { assert(m); PushSeqStack(&(m->data), elem); StackType tmp; if(TopSeqStack(&(m->min), &tmp) == 0) { PushSeqStack(&(m->min), elem); } else { TopSeqStack(&(m->min), &tmp); if(tmp > elem) PushSeqStack(&(m->min), elem); else PushSeqStack(&(m->min), tmp); } return; } void PopMinStack(MinStack* m) { assert(m); PopSeqStack(&(m->data)); PopSeqStack(&(m->min)); return; }