Min栈的实现

问题:实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间复杂度为O(1)

思路:用两个栈来实现,一个存正常栈,另一个存最小栈,要用到栈的基本操作,代码中的"Stack.h"是我写的栈的基本操作的代码

avater

#include <stdio.h>
#include "Stack.h"

typedef struct MinStack
{
    Stack stackNormal;
    Stack stackMin;
}MinStack;

//初始化
void MinStackInit(MinStack *pMS)
{
    StackInit(&(pMS->StackNormal)); // 保存正常序列
    StackInit(&(pMS->StackMin)); //保存最小栈
}

//入栈
void MinSatckPush(MinStack *pMS, StackDataType)
{
    Stack *pmin = &(pMS->stackMin);

	StackPush(&(pMS->stackNormal), data);
    
    //最小栈为空,直接压栈
	if (StackEmpty(pmin))
	{
		StackPush(pmin,data);
		return;
	}
    //当最小值重复的时候,再压一次栈
	if (data <= StackTop(pmin))
	{
		StackPush(pmin, data);
	}
}

//出栈
void MinStackPop(MinStack* pMS)
{
	if (StackTop(&(pMS->stackNormal)) == StackTop(&(pMS->stackMin)))
	{
		StackPop(&(pMS->stackMin));
	}

	StackPop(&(pMS->stackNormal));
}

//栈顶元素
StackDataType MinStackTop(const MinStack *pMS)
{
	return StackTop(&(pMS->stackNormal));
}

//最小值
StackDataType MinStackMin(MinStack *pMS)
{
	return StackTop(&(pMS->stackMin));
}
  • 测试
void TestMinStack()
{
	MinStack	stack;

	MinStackInit(&stack);

	StackDataType numbers[] = { 5, 7, 4, 3, 1, 1, 6, 2 };

	for (int i = 0; i < 8; i++) {
		MinStackPush(&stack, numbers[i]);
		printf("Top = %d, Min = %d\n", MinStackTop(&stack), MinStackMin(&stack));
	}

	for (int i = 0; i < 7; i++) {
		MinStackPop(&stack);
		printf("Top = %d, Min = %d\n", MinStackTop(&stack), MinStackMin(&stack));
	}

}

avater

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值