问题描述:实现一个栈,要求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));
}
}