剑指offer.30 包含min函数的栈

题意

  定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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的运行结果(有待优化…=-=)
在这里插入图片描述

总结

  每日一题,欢迎关注我的微信公众号一起讨论!(记录为主)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值