一.题目
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
二.代码(C)
typedef struct minstack{
int val;
int min;
bool flag;
struct minstack *next;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* obj;
obj = (MinStack*)malloc(sizeof(MinStack));
obj->next=NULL;
obj->val = NULL;
obj->min = NULL;
obj->flag = false;
//printf("%d\n",(&obj));
return obj;
}
void minStackPush(MinStack* obj, int x) {
MinStack* pr=obj;
//printf("%d",obj);
if (pr->flag==false)
{
printf("x=%d\n",x);
pr->val = x;
pr->min = x;
pr->flag = true;
}
else if (pr!=NULL)
{
//printf("x=%d\n",x);
MinStack* pt;
pt = (MinStack*)malloc(sizeof(MinStack));
pt->val = x;
pt->next = NULL;
pt->flag = true;
while(pr->next!=NULL)
{
//printf("%d,%d",pr,pr->next);
pr = pr->next;
}
if (pr->min<=pt->val)
{
pt->min = pr->min;
//printf("pr->min=%d,pt->val=%d,前者更小\n",pr->min,pt->val);
}
else
{
pt->min = pt->val;
//printf("pr->min=%d,pt->val=%d,后者更小\n",pr->min,pt->val);
}
pr->next = pt;
//printf("123");
}
}
void minStackPop(MinStack* obj) {
MinStack* pr=obj;
if (pr && pr->next!=NULL)
{
while(pr->next&&pr->next->next)
{
pr = pr->next;
}
pr->next = NULL;
}
else
{
pr->val = NULL;
pr->min = NULL;
pr->flag = false;
}
}
int minStackTop(MinStack* obj) {
MinStack* pr=obj;
if (pr)
{
while(pr->next)
{
pr = pr->next;
}
return pr->val;
}
else
return -1;
}
int minStackGetMin(MinStack* obj) {
MinStack* pr=obj;
if (pr)
{
while(pr->next)
{
pr = pr->next;
}
return pr->min;
}
else
return -1;
}
void minStackFree(MinStack* obj) {
if (obj)
{
obj->val = NULL;
obj->min = NULL;
obj->next = NULL;
obj->flag = false;
}
}
三.提交记录
四.备注
采用链表的形式实现功能,由于模板限制,只能在尾部插入节点。在C语言中,由于“NULL”和“0”取值相同,无法区分,只能增加“flag”数据标志位帮助判断第一个节点是否保存有数据。
另有双链表等方法缩减时间复杂度,但会增加空间复杂度。