设计一个有getMin功能的栈

最近在看左程云老师的程序员代码面试指南,里面都是一些很经典的算法,贴出来大家一起学习。

题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:1、pop、push、getMin操作的时间复杂度都是O(1)。2、设计的栈类型可以输用现成的栈结构。
方案1:
import java.util.Stack;

public class GetMinStack1 {
    public static class MyStack1 {
        private Stack<Integer> stackData;
        private Stack<Integer> stackMin;

        public MyStack1() {
            this.stackData = new Stack<Integer>();
            this.stackMin = new Stack<Integer>();
        }
   //压入
        public void push(int newNum) {
            if (this.stackMin.isEmpty()) {
                this.stackMin.push(newNum);
            } else if (newNum <= this.getmin()) {
                this.stackMin.push(newNum);
            }
            this.stackData.push(newNum);
        }
    //弹出
        public int pop() {
            if (this.stackData.isEmpty()) {
                throw new RuntimeException("Your stack is empty.");
            }
            int value = this.stackData.pop();
            if (value == this.getmin()) {
                this.stackMin.pop();
            }
            return value;
        }

        public int getmin() {
            if (this.stackMin.isEmpty()) {
                throw new RuntimeException("Your stack is empty.");
            }
            return this.stackMin.peek();
        }
    }

public static void main(String[] args) {
        MyStack1 stack1 = new MyStack1();
        stack1.push(3);
        System.out.println(stack1.getmin());
        stack1.push(4);
        System.out.println(stack1.getmin());
        stack1.push(1);
        System.out.println(stack1.getmin());
        System.out.println(stack1.pop());
        System.out.println(stack1.getmin());:
    }
}



方案2:
import java.util.Stack;
public class GetMinStack2 {

    public static class MyStack2 {
        private Stack<Integer> stackData;//表示一个栈,栈里面每个元素类型都是Integer类型
        private Stack<Integer> stackMin;

        public MyStack2() {
            this.stackData = new Stack<Integer>();
            this.stackMin = new Stack<Integer>();
        }
    //压入
        public void push(int newNum) {
            if (this.stackMin.isEmpty()) {
                this.stackMin.push(newNum);
            } else if (newNum < this.getmin()) {
                this.stackMin.push(newNum);
            } else {
                int newMin = this.stackMin.peek();
                this.stackMin.push(newMin);
            }
            this.stackData.push(newNum);
        }
    //弹出
        public int pop() {
            if (this.stackData.isEmpty()) {
                throw new RuntimeException("Your stack is empty.");
            }
            this.stackMin.pop();
            return this.stackData.pop();
        }

        public int getmin() {
            if (this.stackMin.isEmpty()) {
                throw new RuntimeException("Your stack is empty.");
            }
            return this.stackMin.peek();//peek()找到栈顶对象但不移除,pop()移除栈顶对象并作为此函数的值返回该对象
        }
    }

    public static void main(String[] args) {
        MyStack2 stack2 = new MyStack2();
        stack2.push(3);
        System.out.println(stack2.getmin());
        stack2.push(4);
        System.out.println(stack2.getmin());
        stack2.push(1);
        System.out.println(stack2.getmin());
        System.out.println(stack2.pop());
        System.out.println(stack2.getmin());
    }

}

方案1和方案2都使用stackMin栈保存着stackData每一步的最小值。

共同点是所有操作的时间复杂度都是O(1),空间复杂度都为O(n)。

区别是:方案1中stackMin压入时稍省空间,但是弹出稍费时间;方案2中stackMin压入时稍费空间,但是弹出时稍省时间。

时间: 2024-08-07 08:24:51

设计一个有getMin功能的栈的相关文章

栈和队列----设计一个有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

&quot;Coding Interview Guide&quot; -- 设计一个有getMin功能的栈

[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 [要求] 1. pop.push.getMin操作的时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 [分析] 栈是一种只能在另一端进行操作的具有“先进后出”特性的数据结构,它有push(元素入栈).pop(元素出栈).peek(访问栈顶元素).size(获取栈元素个数)和isEmpty(判断栈是否为空)等基本功能 一般来说,栈并没有提供返回当前栈中最小元素的方法.因为栈只允许在栈顶对元素进行操作

左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. [题解] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作.[要求]1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. 解题思路: 使用一个辅助栈,里面存的目前栈中的最小值 1 #pragma once 2 #inclu

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

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

【算法题】1-设计一个有getMin功能的栈

题目 设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求 pop push getMin操作的时间复杂度都是O(1) 设计的栈类型可以使用现成的栈结构 解答 在设计上使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData:另一个栈用于保存每一步的最小值,这个栈记为stackMin.实现方案有2种: 第一种设计方案 压入数据规则 假设当前数据为newNum,先将其压入stackData.然后判断stackMin是否为空:

算法之设计一个有getMin方法的栈结构

要求该栈的getMin方法和push和pop方法的时间复杂度都是O(1). 设计方案一: package coding.chapter01; import java.util.Stack; /** * Created by Needle on 2017/3/17. */ public class GetMinStack { private Stack<int> dataStack;//存储数据的栈 private Stack<int> minStack;//存储最小值的栈 publ

UE4笔记:利用Widget设计一个切换材质功能

UE4引擎中的Widget蓝图是一个重要的工具,可用于场景中的页面叠加,镜头绑定,场景切换等多处地方,在这里笔者介绍一种利用控件蓝图和场景中物体进行信息交互的方法,直观的体现就是进行物体的材质切换. 1.创建控件蓝图 控件蓝图不同于一般的逻辑蓝图,主要表现在其需要进行画面的设计和平铺.在内容浏览器中创建一个控件蓝图,命名为SwitchMat_UI 双击打开控件蓝图编辑器,进行页面的设计布局. 拖放一个水平盒子到页面中,位置和大小如下图所示(可根据个人喜好进行布局),命名为SwitchMat,同时

实现具有getMin功能的栈

#include "stack.h" #include <stdlib.h> #include <stdio.h> Stack SMin, SData; int PUSH(int *_d) { int temp = 0; PushStack(&SData, _d); if(EmptyStack(&SMin) == 0) PushStack(&SMin, _d); else { GetTopStack(&SMin, &tem

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

[题目] 实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作. [要求] pop.push.getMin操作的时间复杂度都是O(1) 设计的类可以使用现成的栈结构. [分析] 想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取 栈的特点就是先进后出.它的操作具有一定规律,这使得我们可以很好的记录最小值. 很容易就能够想到"双栈"来实现 [实现] 实现语言:C++ 源代码如下: #include<iostrea