最小栈

2人阅读 评论(0) 收藏 举报
分类:

最小栈:有入栈,出栈,取栈顶元素,取出栈内的最小值的时间复杂度均为O(1);

有两种实现方式:

第一种:使用一个栈没入栈一个元素,都再次把最小值插入,所以每次入栈,其实要入两个元素,栈顶永远是最小值,取栈内最小值就是取栈顶元素,将9725入栈,出栈,取栈顶元素如下图:

入栈过程:

出栈:


取栈顶元素:


代码如下:

头文件MinStack1.h

#pragma once

#define MinStackMaxSize 1000

#define MinStackType char

typedef struct MinStack {
    MinStackType data[MinStackMaxSize];
    size_t size;
}MinStack;

void MinStackInit(MinStack* minstack);   //初始化栈

void MinStackPush(MinStack* minstack, MinStackType value); //入栈

void MinStackPop(MinStack* minstack);   //出栈

int MinStackTop(MinStack* minstack, MinStackType* min_value);   //取栈顶元素

头文件的实现Minstack1.c

#include<stdio.h>
#include"MinStack1.h"

void MinStackInit(MinStack* minstack) {
    if(minstack == NULL) {
        return;
    }
    minstack->size = 0;
    return;
}

void MinStackPush(MinStack* minstack, MinStackType value) {
    if(minstack == NULL || minstack->size >= MinStackMaxSize) {
        return;
    }
    if(minstack->size == 0) {
        minstack->data[minstack->size] = value;    
        minstack->size++;
        minstack->data[minstack->size] = value;    
        minstack->size++;
        return;
    }
    MinStackType min;
    min = minstack->data[minstack->size - 1] > value ? value : minstack->data[minstack->size - 1];
    minstack->data[minstack->size] = value;    
    minstack->size++;
    minstack->data[minstack->size] = min;    
    minstack->size++;
    return;
}

void MinStackPop(MinStack* minstack) {
    if(minstack == NULL || minstack->size == 0) {
        return;
    }
    minstack->size -= 2;
}

int MinStackTop(MinStack* minstack, MinStackType* min_value) {
    if(minstack == NULL || min_value == NULL) {
        return 0;
    }
    if(minstack->size == 0) {
        return 0;
    }
    *min_value = minstack->data[minstack->size - 1];
    return 1;
}

/////////////////////////////////////////////////////////////////
//以下为测试代码
//////////////////////////////////////////////////////////////////
MinStack minstack;
void TestMinStack() {
    MinStackInit(&minstack);
    MinStackPush(&minstack, '9');
    MinStackPush(&minstack, '5');
    MinStackPush(&minstack, '7');
    MinStackPush(&minstack, '2');
    
    MinStackType top;
    int ret;
    ret = MinStackTop(&minstack, &top);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 2, actual %c\n", top);
    MinStackPop(&minstack);

    ret = MinStackTop(&minstack, &top);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 5, actual %c\n", top);
    MinStackPop(&minstack);
    
    ret = MinStackTop(&minstack, &top);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 5, actual %c\n", top);
    MinStackPop(&minstack);
    
    ret = MinStackTop(&minstack, &top);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 9, actual %c\n", top);
    MinStackPop(&minstack);
    
    ret = MinStackTop(&minstack, &top);
    printf("ret expected 0, actual %d\n", ret);
    MinStackPop(&minstack);
}

int main()
{
    TestMinStack();

    return 0;
}

实验结果:


缺点:虽然符合最小栈的要求,但是却只能得到栈中的最小值,却不能得到真正入栈的栈顶元素


第二种:使用两个栈,stack 和 min_stack , stack存放真正入栈的元素, min_stack存放stack的最小元素,所以min_stack的栈顶总是当前stack中的最小值,原理如下图:

入栈:


出栈:


取栈顶元素:


代码如下:

头文件:MinStack2.h

#pragma once

#define MinStackMaxSize 1000

#define MinStackType char

typedef struct MinStack {
    MinStackType data[MinStackMaxSize];
    size_t size;
}MinStack;

typedef struct MinStackByTwo {
    MinStack stack;
    MinStack min_stack;
}MinStackByTwo;

void MinStackInit(MinStackByTwo* minstack_bytwo);    //栈的初始化

void MinStackPush(MinStackByTwo* minstack_bytwo, MinStackType value);   //入栈

void MinStackPop(MinStackByTwo* minstack_bytwo); //出栈

int MinStackTop(MinStackByTwo* minstack_bytwo, MinStackType* top, MinStackType* min_value); //取栈顶元素

头文件的实现:MinStack2.c

#include<stdio.h>
#include"MinStack2.h"

void MinStackInit(MinStackByTwo* minstack_bytwo) {
    if(minstack_bytwo == NULL) {
        return;
    }
    minstack_bytwo->stack.size = 0;
    minstack_bytwo->min_stack.size = 0;
    return;
}

void MinStackPush(MinStackByTwo* minstack_bytwo, MinStackType value) {
    if(minstack_bytwo == NULL || minstack_bytwo->stack.size >= MinStackMaxSize) {
        return;
    }
    if(minstack_bytwo->stack.size == 0) {
        minstack_bytwo->stack.data[minstack_bytwo->stack.size] = value;    
        minstack_bytwo->stack.size++;
        minstack_bytwo->min_stack.data[minstack_bytwo->min_stack.size] = value;    
        minstack_bytwo->min_stack.size++;
        return;
    }
    MinStackType min = value;
    if(value >= minstack_bytwo->min_stack.data[minstack_bytwo->min_stack.size - 1]) {
        min = minstack_bytwo->min_stack.data[minstack_bytwo->min_stack.size - 1];
    }
    minstack_bytwo->stack.data[minstack_bytwo->stack.size++] = value;    
    minstack_bytwo->min_stack.data[minstack_bytwo->min_stack.size++] = min;    
    return;
}

void MinStackPop(MinStackByTwo* minstack_bytwo) {
    if(minstack_bytwo == NULL || minstack_bytwo->stack.size == 0) {
        return;
    }
    minstack_bytwo->stack.size -= 1;
    minstack_bytwo->min_stack.size -= 1;
    return;
}

int MinStackTop(MinStackByTwo* minstack_bytwo,MinStackType* top_value, MinStackType* min_value) {
    if(minstack_bytwo == NULL || min_value == NULL) {
        return 0;
    }
    if(minstack_bytwo->stack.size == 0) {
        return 0;
    }
    *min_value = minstack_bytwo->min_stack.data[minstack_bytwo->min_stack.size - 1];
    *top_value = minstack_bytwo->stack.data[minstack_bytwo->stack.size - 1];
    return 1;
}


/////////////////////////////////////////////////////////////////
//以下为测试代码
//////////////////////////////////////////////////////////////////

void TestMinStackByTwo() {
    MinStackByTwo minstack;
    MinStackInit(&minstack);
    MinStackPush(&minstack, '9');
    MinStackPush(&minstack, '5');
    MinStackPush(&minstack, '7');
    MinStackPush(&minstack, '2');

    MinStackType min;
    MinStackType top;
    int ret;
    ret = MinStackTop(&minstack, &top, &min);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 2, actual %c\n", top);
    printf("min expected 2, actual %c\n", min);
    MinStackPop(&minstack);

    ret = MinStackTop(&minstack, &top, &min);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 7, actual %c\n", top);
    printf("min expected 5, actual %c\n", min);
    MinStackPop(&minstack);
    
    ret = MinStackTop(&minstack, &top, &min);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 5, actual %c\n", top);
    printf("min expected 5, actual %c\n", min);
    MinStackPop(&minstack);
    
    ret = MinStackTop(&minstack, &top, &min);
    printf("ret expected 1, actual %d\n", ret);
    printf("top expected 9, actual %c\n", top);
    printf("min expected 9, actual %c\n", min);
    MinStackPop(&minstack);

    ret = MinStackTop(&minstack, &top, &min);
    printf("ret expected 0, actual %d\n", ret);
    MinStackPop(&minstack);
}


int main()
{
    TestMinStackByTwo();

    return 0;
}

实验结果:


查看评论

【Python全栈】第五周 Python Web项目开发实现(上)

本周课程主要讲解通过Django框架搭建Web商城项目,并且开发了网站的后台模块。具体内容有:项目开发流程介绍,商城项目需求分析、数据库设计和项目程序设计,使用Django框架搭建Web商城项目主体结构。开发了商城项目的后台管理:登陆与退出、会员信息管理、商品类别管理和商品信息管理等模块。
  • 1970年01月01日 08:00

算法学习 - 最小栈的实现O(1)时间

最小栈 最小栈其实和栈没有什么区别的,唯一的区别在于最小栈是可以在O(1)时间内得到当前的栈空间里,最小的值是多少。 最小栈的操作 最小栈的操作和普通栈的操作没有太大区别,唯一多了一个方法就是g...
  • chenfs1992
  • chenfs1992
  • 2014-12-05 03:56:24
  • 4489

找到栈最小元素

题意描述:定义栈的数据结构,请在该类型中实现一个能够找到栈最小元素的min函数。在该栈调用min、push、pop的时间复杂度都是O(1) 解题思路:引用数据栈和辅助栈解题, 入栈:数据栈中直接压...
  • u012050154
  • u012050154
  • 2016-06-06 15:54:19
  • 1297

LeetCode 155 Min Stack(最小栈)

翻译设计支持push、pop、top和在常量时间内检索最小元素的栈。push(x) —— 推送元素X进栈 pop() —— 移除栈顶元素 top() —— 得到栈顶元素 getMin() —— 检索栈...
  • NoMasp
  • NoMasp
  • 2016-01-30 10:50:43
  • 4620

实现一个最大栈、最小栈

思路分析:在栈中实现一个方法 每一调用该方法可以获得当前栈中的最大值 通过把两个栈封装在一个栈中 其中的一个栈存放正常的元素 另一个栈max只存最大元素  如果push()一个数 如果这个数比 最大栈...
  • u013078669
  • u013078669
  • 2016-03-31 20:47:49
  • 948

最小栈(Java实现)

/** * By returnZhang * 用栈实现最小栈(获取栈中最小值) * 数据栈 stackData * 栈中最小数据 stackMin */ public class Min...
  • returnzhang
  • returnzhang
  • 2017-11-22 22:07:18
  • 66

算法-最小栈的实现-minStack

//栈 先入后出的集合//最小栈的实现 /*. 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。 要保证这三个方法的时间复杂度都是O(1)。*//* 栈...
  • softwarenb
  • softwarenb
  • 2016-12-02 20:29:19
  • 1134

找出栈中最小的元素

package stack; /**  * 找出栈中最小的元素  * 先定义一个辅助栈,栈顶永远存最小的元素。如原栈中添加元素比辅助栈顶元素大,辅助栈的栈顶元素复制一遍  * 放到辅助...
  • hanjiaqun
  • hanjiaqun
  • 2016-09-10 09:12:35
  • 828

C语言强化(二)设计可以求最小元素的栈

上一篇详解了二叉树转双向链表,此篇作为【C语言强化】系列第二篇,来聊聊有关栈的一道题,...
  • hzy38324
  • hzy38324
  • 2015-04-21 07:42:43
  • 1040

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。时间复杂度都是O(1)

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求:使得时间复杂度都是O(1)...
  • A784586
  • A784586
  • 2017-02-19 16:56:49
  • 673
    个人资料
    持之以恒
    等级:
    访问量: 1389
    积分: 504
    排名: 10万+
    文章存档
    最新评论