包含min函数的栈结构——C语言

题目出至结构之法博客——微软一百题。

定义栈的数据结构,添加一个min函数,能够得到栈的最小元素。

要求函数min, push以及pop的时间复杂度都是O(1)。

由于要使得min函数的时间复杂度为O(1),那么就不能通过遍历O(n)来求最小值。可以通过在push阶段就确定最小值,使用min函数直接返回该值,就能够使得min函数的复杂度为O(1)。

#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量

typedef struct{
    int *base;
    int *top;
    int min;    //标记最小值
    int stacksize;
}SqStack;

SqStack* InitStack()
{
    SqStack *S = ( SqStack* )malloc( sizeof( SqStack ) );  //指向栈结构的指针
    S->base = ( int* )malloc( STACK_INIT_SIZE * sizeof( int ) );  //指向数据的指针
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return S;
}

void Push( SqStack *S, int e )  //入栈
{
    if( S->top - S->base >= S->stacksize )  //容量不足时增加存储容量
        {
            S->base = ( int* )realloc( S->base, ( S->stacksize + STACKINCREMENT ) * sizeof( int ) );  //扩容
            S->top = S->base + S->stacksize;
            S->stacksize += STACKINCREMENT;
        }
    if( S->top == S->base || e < S->min )  //min的初值为第一个入栈的数,每次输入都进行比较并存储最小值
        S->min = e;
    * S->top++ = e;
}

int Pop( SqStack *S )  //出栈
{
    if( S->top == S->base ) return 0;
    return * --S->top;
}


int MinStack( SqStack *S )  //返回最小值
{
    return S->min;
}

main()
{
    int i, e, min;
    SqStack *S;
    S = InitStack();
    for( i = 0; i < 4; i++ )  //建立栈
    {
        printf( "Push Number e: \n" );
        scanf( "%d", &e );
        Push( S, e );
    }
    min = MinStack( S );
    printf( "%d\n", min );
}

原文地址:https://www.cnblogs.com/liangchao/p/2709952.html