/*
总结:
1、用链表实现堆栈,只需要在末尾添加和删除节点,并在每个节点中记录此前最小值和当前值;
2、头节点用作哨兵节点,不记录值,为了方便增删;
注意点:
1、删除节点时可用t->next->next!=NULL找到倒数第二个节点;
难点:
1、链表的熟练运用;
*/
#include <stdio.h>
#include <limits.h>
typedef struct LinkList
{
int data;
int min;
struct LinkList *next;
} MinStack;
MinStack* minStackCreate()
{
MinStack *head,*end;
head=malloc(sizeof(MinStack));
end=head;
end->min=INT_MAX;
end->next=NULL;
return head;
}
void minStackPush(MinStack* obj, int val)
{
MinStack *t=obj,*in;
while(t->next!=NULL)
{
t=t->next;
}
in=malloc(sizeof(MinStack));
in->data=val;
if(val<t->min)
{
in->min=val;
}
else
{
in->min=t->min;
}
t->next=in;
in->next=NULL;
}
void minStackPop(MinStack* obj)
{
MinStack *t=obj;
while(t->next->next!=NULL)
{
t=t->next;
}
free(t->next);
t->next=NULL;
}
int minStackTop(MinStack* obj)
{
MinStack *t=obj;
while(t->next!=NULL)
{
t=t->next;
}
return t->data;
}
int minStackGetMin(MinStack* obj)
{
MinStack *t=obj;
while(t->next!=NULL)
{
t=t->next;
}
return t->min;
}
void minStackFree(MinStack* obj)
{
free(obj);
}