实现一个栈,Push、Pop、Min的时间复杂度为O(1)【数据结构】

本文介绍两种实现最小栈的方法:一种是通过结构体记录每个元素及其当前最小值;另一种是使用两个栈,分别存储所有元素和最小元素。每种方法都提供了完整的代码实现及测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1>将最小值和当前元素封装成结构体<data, mindata>

MinStack.h

typedef int ElemType;

typedef struct Elem
{
	ElemType _data;
	ElemType _mindata;
}Elem;

void InitMinStack(MinStack* s);
void MinStackPush(MinStack* s, ElemType data);void MinStackPop(MinStack* s);ElemType TopMinStack(MinStack* s);int SizeMinStack(MinStack* s);ElemType MinStackMin(MinStack* s);

MinStack.c

void InitMinStack(MinStack* s)
{
	assert(!StackEmpty(&(s->_s)));
	InitStack(&(s->_s));
}

void MinStackPush(MinStack* s, ElemType data)
{
	Elem elem;//当前要入栈的结构体
	Elem top;	//栈顶结构体
	assert(s);
	elem._data = data;		
	elem._mindata = data;
	//栈中没有数据----空栈
	if (StackEmpty(&(s->_s)))
	{
		PushStack(&(s->_s), elem);
	}
	else//栈中有数据
	{
		top = TopStack(&(s->_s));
		if (top._mindata < elem._data)	//栈顶的最小值大于要插入的最小值
		{
			elem._mindata = top._mindata;
		}
		PushStack(&(s->_s), elem);//入栈
	}
}

void MinStackPop(MinStack* s)
{
	assert(s);
	if (StackEmpty(&(s->_s)))	//栈为空
		return;
	PopStack(&(s->_s));
}

int MinStackEmpty(MinStack* s)
{
	assert(s);
	return StackEmpty(&s->_s);
}


ElemType TopMinStack(MinStack* s)
{
	assert(!MinStackEmpty(s));
	return TopStack(&(s->_s))._data;
}

int SizeMinStack(MinStack* s)
{
	assert(s);
	return SizeStack(&(s->_s));
}

ElemType MinStackMin(MinStack* s)
{
	assert(s);
	return TopStack(&(s->_s))._mindata;
}

void TestMinStack()
{
	MinStack ms;
	InitMinStack(&ms);
	MinStackPush(&ms, 2);
	MinStackPush(&ms, 5);
	MinStackPush(&ms, 4);
	MinStackPush(&ms, 3);
	MinStackPush(&ms, 1);
	printf("size = %d\n", SizeMinStack(&ms));
	printf("min = %d\n", MinStackMin(&ms));
	printf("top = %d\n", TopMinStack(&ms));
	MinStackPop(&ms);
	printf("size = %d\n", SizeMinStack(&ms));
	printf("min = %d\n", MinStackMin(&ms));
	printf("top = %d\n", TopMinStack(&ms));
}
2>两个栈、一个存所有元素、一个存最小元素

MinStack.h

typedef SDataType MSDateType;

typedef struct MinStack
{
	Stack _data;	//当前元素的栈
	Stack _mindata;	//最小值的栈
}MinStack;

void InitMinStack(MinStack* s);
int MinStackEmpty(MinStack* s);
void PushMinStack(MinStack* s, MSDateType data);
void PopMinStack(MinStack* s);
MSDateType MinStackTop(MinStack* s);
MSDateType MinStackMin(MinStack* s);
int SizeMinStack(MinStack* s);

MinStack.c

void InitMinStack(MinStack* s)
{
	assert(s);
	InitStack(&s->_data);
	InitStack(&s->_mindata);
}

int MinStackEmpty(MinStack* s)
{
	return  StackEmpty(&s->_data);
}


void PushMinStack(MinStack* s, MSDateType data)
{
	assert(s);
	if (MinStackEmpty(s) || data < TopStack(&s->_mindata))
	//栈为空或者当前的值小于最小栈顶的值,当前元素入最小栈
	{
		PushStack(&s->_mindata,data);
	}
	PushStack(&s->_data, data);//入数据栈
}

void PopMinStack(MinStack* s)
{
	if (MinStackEmpty(s))
	{
		return;
	}
	if (TopStack(&s->_data) == TopStack(&s->_mindata))
	{
		PopStack(&s->_mindata);
	}
	PopStack(&s->_data);
}

MSDateType MinStackTop(MinStack* s)
{
	return TopStack(&s->_data);
}

MSDateType MinStackMin(MinStack* s)
{
	return TopStack(&s->_mindata);
}

int SizeMinStack(MinStack* s)
{
	return SizeStack(&s->_data);
}

void TestMinStack2()
{
	MinStack ms;
	InitMinStack(&ms);
	PushMinStack(&ms, 2);
	PushMinStack(&ms, 3);
	PushMinStack(&ms, 4);
	PushMinStack(&ms, 1);
	PushMinStack(&ms, 5);
	printf("size = %d\n", SizeMinStack(&ms));
	printf("min = %d\n", MinStackMin(&ms));
	printf("top = %d\n", MinStackTop(&ms));
	PopMinStack(&ms);
	printf("size = %d\n", SizeMinStack(&ms));
	printf("min = %d\n", MinStackMin(&ms));
	printf("top = %d\n", MinStackTop(&ms));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值