【栈和队列面试题】实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1)

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

//MinStack.h
#pragma once

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

//最小栈
// 初始化
// Push/Pop/Top/Min	要求 O(1)
typedef struct MinStack {
	Stack stackNormal;   //保存正常序列
	Stack stackMin;		 //保存当前最小数
}MinStack;

void MinStackInit(MinStack* pMS);
void MinStackPush(MinStack* pMS, StackDataType data);
void MinStackPop(MinStack* pMS);
StackDataType MinStackTop(MinStack* pMS);
StackDataType MinStackMin(MinStack* pMS);
void TestMinStack();


//MinStack.c
#include "Min栈.h"
#include "Stack.h"
#include "stdio.h"

void MinStackInit(MinStack* pMS)
{
	StackInit(&(pMS->stackMin));
	StackInit(&(pMS->stackNormal));
}
void MinStackPush(MinStack* pMS, StackDataType data)
{
	//正常序列栈,正常入站即可
	StackPush(&(pMS->stackNormal), data);
	//最小栈入栈
	if (StackIsEmpty(&(pMS->stackMin))) {
		StackPush(&(pMS->stackMin), data);
		return;
	}
	if (data < getTop(&(pMS->stackMin))) {
		StackPush(&(pMS->stackMin), data);
	}
}
void MinStackPop(MinStack* pMS)
{
	if (getTop(&pMS->stackMin) == getTop(&(pMS->stackNormal))) {
		StackPop(&(pMS->stackMin));
	}
	StackPop(&(pMS->stackNormal));

}
StackDataType MinStackTop(MinStack* pMS)
{
	return getTop(&(pMS->stackNormal));
}
StackDataType MinStackMin(MinStack* pMS)
{
	return getTop(&(pMS->stackMin));
}


//测试函数
void TestMinStack()
{
	MinStack stack;

	MinStackInit(&stack);
	StackDataType numbers[] = { 5, 7, 4, 3, 1, 6, 2 };

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值