问题:实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值)的时间复杂度为O(1)
思路:用两个栈来实现,一个存正常栈,另一个存最小栈,要用到栈的基本操作,代码中的"Stack.h"是我写的栈的基本操作的代码
#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));
}
}