题意
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
解题思路
使用双栈的方式,一个栈存储输入的数据、另一个存入当前数据位置到第一个数据中最小值。可以使min、push 及 pop 的时间复杂度都是 O(1)。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct stack {
int value;
struct stack *next;
} stack_t;
typedef struct {
stack_t *head;
stack_t *min;
} MinStack;
/** initialize your data structure here. */
void stack_push(stack_t *head, int value)
{
stack_t *node = NULL;
if (head == NULL)
return ;
node = (stack_t *)malloc(sizeof(stack_t));
if (node == NULL)
return ;
node->value = value;
node->next = head->next;
head->next = node;
}
int stack_pop(stack_t *head)
{
int value = -1;
stack_t *node;
if (head == NULL || head->next == NULL)
return value;
node = head->next;
head->next = node->next;
value = node->value;
free(node);
return value;
}
MinStack* minStackCreate() {
MinStack *node = NULL;
node = (MinStack *)malloc(sizeof(MinStack));
if (node == NULL)
return NULL;
node->head = (stack_t *)malloc(sizeof(stack_t));
if (node->head == NULL) {
free(node);
return NULL;
}
node->head->next = NULL;
node->min = (stack_t *)malloc(sizeof(stack_t));
if (node->min == NULL) {
free(node->head);
free(node);
return NULL;
}
node->min->next = NULL;
return node;
}
void minStackPush(MinStack* obj, int x) {
int min = -1;
if (obj == NULL || obj->head == NULL || obj->min == NULL)
return ;
if (obj->head->next == NULL && obj->min->next == NULL)
min = x;
else
min = obj->min->next->value < x ? obj->min->next->value : x;
stack_push(obj->head, x);
stack_push(obj->min, min);
}
void minStackPop(MinStack* obj) {
if (obj == NULL || obj->head == NULL || obj->min == NULL || \
obj->head->next == NULL || obj->min->next == NULL )
return ;
stack_pop(obj->head);
stack_pop(obj->min);
}
int minStackTop(MinStack* obj) {
int value = -1;
if (!(obj == NULL || obj->head == NULL || obj->min == NULL)) {
value = stack_pop(obj->head);
stack_pop(obj->min);
}
return value;
}
int minStackMin(MinStack* obj) {
if (obj == NULL || obj->head == NULL || obj->min == NULL || \
obj->head->next == NULL || obj->min->next == NULL )
return -1;
else
return obj->min->next->value;
}
void minStackFree(MinStack* obj) {
if (obj == NULL || obj->head == NULL || obj->min == NULL)
return ;
while (obj->head->next != NULL)
minStackPop(obj);
free(obj->head);
free(obj->min);
free(obj);
}
int main(int argc, char **argv) {
return 0;
}
/**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, x);
* minStackPop(obj);
* int param_3 = minStackTop(obj);
* int param_4 = minStackMin(obj);
* minStackFree(obj);
*/
运行结果
以下为leetcode的运行结果(有待优化…=-=)
总结
每日一题,欢迎关注我的微信公众号一起讨论!(记录为主)