实现一个栈:取栈中的最小值的时间复杂度为O(1)

原创 2018年04月15日 15:27:56

思路:每次入栈前先找到最小的元素(每次有新元素入栈时就将新的元素假设为最小的元素min)(情况1:入栈时,栈内没有任何元素,即是一个空栈。这时候先将要入栈的元素入栈,再紧接着将最小的元素入栈;*情况2*:入栈时栈内已经有元素了,这时候将最小值min与栈顶元素相比较,如果栈顶元素比最小值还要小,则将其赋值给最小值min(min永远是最小的值)。然后先将要入栈的元素入栈再紧接着将最小值入栈。)如此一来,总是最小值最后入栈,那么取栈顶元素时,栈顶元素永远是最小的那一个
minStack.h文件

#pragma once 

typedef char minStackType;

typedef struct minStack
{
    minStackType *data;
    //有效元素个数
    int size;
    //表示data段内存中能容纳的元素个数
    int capacity;
}minStack;
//初始化函数
void minStackInit(minStack *stack);
//销毁函数
void minStackDestroy(minStack *stack);
//入栈函数
void minStackPush(minStack *stack,minStackType value);
//出栈函数
void minStackPop(minStack *stack);
//取栈顶元素函数
int minStackGetTop(minStack *stack,minStackType *value);

minStack.c文件

#include<stdio.h>
#include"minSeqStack.h"
#include<stdlib.h>

#define Test_Header printf("\n==========%s==========\n",__FUNCTION__);


//初始化函数
void minStackInit(minStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    stack->size = 0;
    stack->capacity = 1000;
    stack->data = (minStackType*)malloc(stack->capacity * sizeof(minStackType));
}
//销毁函数
void minStackDestroy(minStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    free(stack->data);
    stack->data = NULL;
    stack->size = 0;
    stack->capacity = 0;
}
//入栈函数
void minStackPush(minStack *stack,minStackType value)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    //每一次入栈前判断栈是否满了
    if(stack->size == stack->capacity)
    {
        //栈满了,没有空间可供新元素插入
        return;
    }
    //假定要插入的值就是最小的值
    minStackType min = value;
    if(stack->size == 0)
    {
        //空栈
        //每次入栈两次,最小的值总是最后入栈
        stack->data[stack->size++] = value;
        stack->data[stack->size++] = min;
    }
    //不是空栈
    else
    {
        //如果当前栈中的栈顶元素比假定的最小值还要小
        if(min > stack->data[stack->size-1])
        {
            //改变最小值
            min = stack->data[stack->size-1];
        }
        //先将value入栈,再将最小值入栈
        stack->data[stack->size++] = value;
        stack->data[stack->size++] = min;
    }
}
//出栈函数
void minStackPop(minStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    if(stack->size == 0)
    {
        //空栈,没有元素可以出栈
        return;
    }
    //不是空栈
    else
    {
        //此时需要出栈两个元素才会将我们最后插入的元素(包括一个新的值和最后插入的最小的值)出栈
        stack->size -= 2;
    }
}
//取栈顶元素函数,成功取到栈顶元素就返回1,否则返回0
int minStackGetTop(minStack *stack,minStackType *value)
{
    if(stack == NULL)
    {
        //非法输入
        return 0;
    }
    if(stack->size == 0)
    {
        //空栈
        return 0;
    }
    //不是空栈
    *value = stack->data[stack->size-1];
    return 1;
}
void Print(minStack *stack,const char *msg)
{
    printf("[%s]\n",msg);
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    if(stack->size == 0)
    {
        //空栈
        return;
    }
    int i = 0;
    for(;i < stack->size;i++)
    {
        printf("%c ",stack->data[i]);
    }
    printf("\n");
}


void TestMinSeqStack()
{
    Test_Header;
    minStack stack;
    //初始化栈并测试
    minStackInit(&stack);
    printf("expected size = 0,capacity = 1000,actual size = %d,capacity = %d\n\n",stack.size,stack.capacity);
    //入栈函数测试
    minStackPush(&stack,'x');
    minStackPush(&stack,'y');
    Print(&stack,"入栈2个元素:x y");
    //以下为取栈顶元素函数测试(栈顶元素总是最小值)
    minStackType value;

    int ret = minStackGetTop(&stack,&value);
    printf("expected ret = 1,actual ret = %d\n",ret);
    printf("expected min = x,actual min = %c\n\n",value);

    minStackPush(&stack,'g');
    Print(&stack,"再入栈一个元素:g");
    ret = minStackGetTop(&stack,&value);
    printf("expected ret = 1,actual ret = %d\n",ret);
    printf("expected min = g,actual min = %c\n\n",value);

    minStackPush(&stack,'w');
    Print(&stack,"再入栈一个元素:w");
    ret = minStackGetTop(&stack,&value);
    printf("expected ret = 1,actual ret = %d\n",ret);
    printf("expected min = g,actual min = %c\n\n",value);
    //出栈函数测试
    minStackPop(&stack);
    minStackPop(&stack);
    minStackPop(&stack);
    minStackPop(&stack);
    Print(&stack,"将所有元素出栈");
    //空栈取栈顶元素测试
    ret = minStackGetTop(&stack,&value);
    printf("expected ret = 0,actual ret = %d\n\n",ret);
    //销毁栈
    minStackDestroy(&stack);
    printf("expected size = 0,capacity = 0,actual size = %d,capacity = %d\n\n",stack.size,stack.capacity);
}
//主函数调用测试函数
int main()
{
    TestMinSeqStack();
    return 0;
}

测试结果如下图:这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40927789/article/details/79949682

Web 全栈第一周

Web 前端工程师课程(new) 第1周
  • 2017年11月06日 20:01

栈表中获取最小值,时间复杂度为O(1)

近来复习数据结构,看到网上有一道数据结构的算法题,该题目为google的一道面试题,国内很多互联网公司也纷纷效仿该题。        题目内容为:对现在的stack(栈)数据结构进行改进,加一个min...
  • helinlin007
  • helinlin007
  • 2016-04-11 22:16:41
  • 4520

实现一个栈:取栈中的最小值的时间复杂度为O(1)

思路:每次入栈前先找到最小的元素(每次有新元素入栈时就将新的元素假设为最小的元素min)(情况1:入栈时,栈内没有任何元素,即是一个空栈。这时候先将要入栈的元素入栈,再紧接着将最小的元素入栈;*情况2...
  • qq_40927789
  • qq_40927789
  • 2018-04-15 15:27:56
  • 15

栈的最小值查找(O1)

问题描述 错误的解决思路 正确的解决思路 问题描述 对栈增加一个获取最小值的方法(getMin),要求, 时间复杂度为O(1)。 错误的解决思路 定义一个minIndex,存储最小值的下标。...
  • laiwenqiang
  • laiwenqiang
  • 2017-01-05 00:57:17
  • 651

【数据结构】栈面试题---以O(1)时间复杂度求最小值

假设给出一组数字,我们需要在O(1)时间复杂度内完成对这组数字最小值的求解。 题目具体描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小值元素的min函数。在该栈中,调用min, push和...
  • peiyao456
  • peiyao456
  • 2016-10-06 14:38:19
  • 617

获取栈中最小值函数,时间复杂度为O(1)

class Solution {//方案一 节省空间但是费时间 stack stackData,stackMin; public: void push(int value) { ...
  • shizheng163
  • shizheng163
  • 2016-03-17 19:35:38
  • 173

O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素

定义栈的数据结构,添加min()、max()函数(动态获取当前状态栈中的最小元素、最大元素),要求push()、pop()、min()、max()的时间复杂度都是O(1)。...
  • happy309best
  • happy309best
  • 2015-08-17 15:36:47
  • 946

如何用O(1)的时间复杂度求栈中最小元素

由于栈具有先进后出的特点,push和pop也只能对栈顶元素进行操作。而题目要求的是在O(1)的时间复杂度求得最小元素,显然是不可以遍历求取的。这里可以用两个栈来实现,一个栈用来存取数据,另一个用来存栈...
  • afd_326
  • afd_326
  • 2016-07-06 11:34:40
  • 635

实现一个栈,实现入栈,出栈,求最小值,时间复杂度为O(1)

题目: 实现一个栈,实现入栈,出栈,求栈中最小值,时间复杂度为O(1) 方案一: 设计栈中元素类型为一个包含元素值和当前栈中所有元素的最小值的对象 入栈时,将对象入栈,当前元素的值小于栈中最小...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016-04-16 23:58:32
  • 2891

设计一个栈,提供一个函数能够找出栈内最大的元素,时间复杂度为O(1)

这是一道淘米网的面试题,当时面试官直接拿出一张纸来让我写出实现方法。我思考了一会,就是关于时间复杂度这块,实在是没有办法,因为我想的都是要 遍历一遍这个栈,这样肯定超了,在面试完回来之后,我思考了一...
  • gengdidi
  • gengdidi
  • 2015-09-21 13:40:04
  • 1664
收藏助手
不良信息举报
您举报文章:实现一个栈:取栈中的最小值的时间复杂度为O(1)
举报原因:
原因补充:

(最多只允许输入30个字)