欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 13:32:33
...

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

  • st入栈
  • 如果minst为空,则入栈minst;
  • 如果minst非空,或者minst的栈顶元素大于等于下一个入栈元素,minst也入栈该元素
  • 如果st与minst站定元素相等,则出栈minst;无论怎样,st每次都需要出栈

MinStack.h

#pragma once
#include"Stack.h"
typedef struct MinStack
{
    Stack st;
    Stack minst;
}MinStack;
void MinStackInit(MinStack *ms);
void MinStackDestory(MinStack *ms);
void MinStackPush(MinStack *ms, DataType x);
void MinStackPop(MinStack *ms);
DataType MinStackTop(MinStack *ms);
int MinStackEmpty(MinStack *ms);
int MinStackSize(MinStack *ms);
int MinStackMin(MinStack *ms);

MinStack.c

#include "MinStack.h"

void MinStackInit(MinStack * ms)//初始化栈
{
    assert(ms);
    StackInit(&ms->st);
    StackInit(&ms->minst);
}

void MinStackDestory(MinStack * ms)//销毁栈
{
    assert(ms);
    StackDestory(&ms->st);
    StackDestory(&ms->minst);
}

void MinStackPush(MinStack * ms, DataType x)//入栈
{
    assert(ms);
    StackPush(&ms->st, x);
    if (StackEmpty(&ms->minst) == 0
        || StackTop(&ms->minst) >= x)
    {
        StackPush(&ms->minst, x);
    }
}

void MinStackPop(MinStack * ms)//出栈
{
    assert(ms);
    if (StackTop(&ms->st) == StackTop(&ms->minst))
    {
        StackPop(&ms->minst);
    }
    StackPop(&ms->st);
}

DataType MinStackTop(MinStack * ms)//获取栈顶元素
{
    assert(ms);
    return StackTop(&ms->st);
}

int MinStackEmpty(MinStack * ms)//判断栈空
{
    assert(ms);
    return StackEmpty(&ms->st);
}

int MinStackSize(MinStack * ms)//获取栈大小
{
    assert(ms);
    return StackSize(&ms->st);
}

int MinStackMin(MinStack * ms)//返回最小值
{
    assert(ms);
    return StackTop(&ms->minst);
}