设计一个获取最小值时间复杂度为O(1)的栈

【题目】

  • 实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作。

【要求】

  • pop、push、getMin操作的时间复杂度都是O(1)
  • 设计的类可以使用现成的栈结构。

【分析】

  • 想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取
  • 栈的特点就是先进后出。它的操作具有一定规律,这使得我们可以很好的记录最小值。
  • 很容易就能够想到“双栈”来实现

【实现】

  • 实现语言:C++
  • 源代码如下:
#include<iostream>
#include<stack>
using namespace std;

#define Error -1

// 一个有获取最小值功能的特殊栈,获取最小值的时间复杂度为O(1)
class GetMinStack
{
    private:
    stack<int> m_BasicStack;                 //主栈
    stack<int> m_MinNumStack;                //最小值栈

    public:
    void push(int value)                     //入栈
    {
        if(m_BasicStack.empty())            //如果栈中无数据
            m_MinNumStack.push(value);
        else if(value<=m_MinNumStack.top())  //如果入栈的值比当前的最小值还要小
            m_MinNumStack.push(value);

        m_BasicStack.push(value);
    } 

    int pop()
    {
        if(m_MinNumStack.empty())
        {
            //不可出栈
            cout<<"您操作的栈为空"<<endl;
            return Error;
        }

        int temp=m_BasicStack.top();
        m_BasicStack.pop();
        if(temp==m_MinNumStack.top())
            m_MinNumStack.pop();

        return temp;
    }

    int getMin()
    {
        if(m_MinNumStack.empty())
        {
            //不可出栈
            cout<<"您操作的栈为空"<<endl;
            return Error;
        }
        return m_MinNumStack.top();
    }
};

int main()
{
    GetMinStack test;
    test.push(5);
    test.push(8);
    test.push(4);
    test.push(10);

    cout<<"该栈最小的数为:"<<test.getMin()<<endl;
}
  • 运行截图

原文地址:https://www.cnblogs.com/ZhuSenlin/p/12381055.html

时间: 2024-10-13 01:10:50

设计一个获取最小值时间复杂度为O(1)的栈的相关文章

1.给栈添加一个获取最小值的方法(元素为Integer型),要求时间复杂度为O(1)

分析:在数据结构与算法中,当要求时间复杂度最小时基本都是要牺牲空间复杂度.栈是先进后出,此处要求用栈实现一个获取最小值的方法且时间复杂度为O(1),首先考虑的方向就是再借助一个栈来实现,这个栈主要用来保存最小值序列(这个地方可以思考一下为什么不能用一个变量来保存最小值). 下面直接附上代码: public class StackMin{ Stack<Integer> stackDate=new Stack<>();//一个普通栈,存入进入栈的元素 Stack<Integer&

如何设计一个优雅的RESTFUL的接口

一 .引入 设计接口是我们开发人员的日常操作.当我们把接口交给前端人员时,是否有种拔剑出鞘的错觉.毕竟交付接口,我们的开发工作就阶段性完成了.不过,如果我们没有一个接口设计规范的时候,结果会怎样呢?我们来张图感受一下. 二.REST 2000年,一个年轻小伙子(Roy Thomas Fielding)在他的博士论文提出了 REST.REST 是一种万维网软件架构风格.为什么说是风格不是标准呢?个人理解可能说标准就有点过分了.小伙子做不到.随后这种风格被推广开来,漂洋过海,被大众熟知.在 REST

设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值,push、pop、min三个方法的时间复杂度必须是O(1)

1 /* 2 * 设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值, 3 * push.pop.min三个方法的时间复杂度必须是O(1) 4 * 一种解法是在Stack类里添加一个Int型的minValue,当minValue出栈时,我们会搜索整个栈 5 * 找出最新的最小值,但是却不符合操作时间为O(1)的要求 6 * 如有: 7 * push(4)//最小值:4 8 * push(5)//最小值:4 9 * push(3)//最小值:3 10 * push(1)

011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)

实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值. push,pop和min函数的时间复杂度都为O(1). 看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否? 如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值. 可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办. 既然只用一个变量没法解决这个问题,那我们就增加变量.如果说每个结点除了保存当前的 值, 另外再保存一个从该结点到栈底的

设计一个带有getmin功能的栈,保证时间复杂度在O(1)

2017-06-22  20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立两个栈,一个存放数据,一个存放最小值. push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入.这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入:

栈和队列----设计一个有getMin功能的栈

设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class GetMinStack { //定义两个栈,一个存放正常的数据,一个存放最小值 Stack<Integer> stackData = new S

线程池? 如何设计一个动态大小的线程池,有哪些方法?

[线程池?  如何设计一个动态大小的线程池,有哪些方法?] 线程池:顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中, 需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中, 从而减少创建和销毁线程对象的开销. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.此时,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池相似,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable

设计一个字节数组缓存类

转 http://blog.csdn.net/kakashi8841/article/details/42025367 版权所有,转载须注明出处! 1.为什么要 在做网络通信的时候,经常需要用到: 读:就是我们需要从网络流里面读取字节数据,并且由于分包的原因,我们需要自己缓存这些数据,而不是读完立刻丢掉. 写:我们需要把各种类型的数据变成字节写入.比如把int.string.short等变成字节数组写入流. 2.需要什么 我们需要设计一个类来实现: 支持可以不停地往这个类中添加字节 支持写入in

模拟MMU设计一个将IPv4地址索引化的路由表,不同于DxR

我不知道有没有人这么玩过,也许有,也许没有.时间和空间永远都在厚此薄彼,只因为设施不全,在资源匮乏的年代,只能取舍.但是如果资源丰盈,鱼 与熊掌,完全可以兼得!对于路由查找而言,紧凑的数据结构占用了很小的空间,难道它就要为此付出时间的代价吗?如果我们考虑MMU设施,就会发现,紧凑的 数据结构不但节省了空间,还提高了速度.       我们长期受到的教育就是取义一定要舍身这样的教育,如果不舍身,取到的不会是义,也可能会被讹诈,不怪自己被讹,只因自己没死.其实仔细想想,即便在资源 不那么丰盈,甚至资