请设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
存储方式采用顺序栈,栈的节点包括数据data,当前栈中的最小值min
#define STACK_INIT_SIZE 100
#define STACKIN 10
//栈节点
typedef struct Element{
int data;
int min;
}Element;
//顺序栈
typedef struct Stack{
Element *base;
Element *top;
int stacksize;
}Stack;
Stack StackInit(){ //构造一个空栈
Stack s;
s.base=(Element*)malloc(STACK_INIT_SIZE*sizeof(Element));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return s;
}
void Push(Stack &s,int e){ //入栈
if((s.top-s.base)>=s.stacksize){
s.base=(Element*)realloc(s.base,(s.stacksize+STACKIN)*sizeof(Element));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKIN;
}
if(s.base==s.top){
s.top->data=e;
s.top->min=e;
s.top++;
}
if(e<(s.top-1)->min){
s.top->data=e;
s.top->min=e;
s.top++;
}
else{
s.top->data=e;
s.top->min=(s.top-1)->min;
s.top++;
}
}
int Pop(Stack &s,int &e){ //出栈
if(s.base==s.top) return ERROR;
e=(--s.top)->data;
return OK;
}
int min(Stack s){//求当前栈中的最小值
if(s.base==s.top)
return ERROR;
int min1;
min1=(s.top-1)->min;
return min1;
}