• 包含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 );
    }

  • 相关阅读:
    用了7年做到项目经理,女朋友却离开了我
    手把手教你建网站--程序小白适用篇
    燃尽图的学习与理解
    每周进度
    四人组队
    读构建之法之感
    两人组队,小学生的四则运算
    词汇统计
    AMQP中的架构和组成元素
    MSSQL机制
  • 原文地址:https://www.cnblogs.com/liangchao/p/2709952.html
Copyright © 2020-2023  润新知