设计一个有getMin功能的栈

原创 2016年08月30日 10:16:01

设计一个有getMin功能的栈

题目:

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

要求:

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

实现

思路:在设计上我们使用两个栈,一个栈保存当前栈的元素,其功能和一个正常的栈没有区别,这个栈标记为stackData。另一个栈用于保存每一步的最小值,这个栈标记为stackMin

方法一

/**
 * Created by csx on 2016/8/30.
 */
public 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();
    }
}

方法二

/**
 * Created by csx on 2016/8/30.
 */
public class MyStack2 {
    private Stack<Integer> stackData;
    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();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[算法最优]设计一个有getMin功能的栈

题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求:1、pop、push、getMin操作的时间复杂度都是O(1) 2、设计的栈类型可以输用现成的栈结构首先看下...
  • CodeEmperor
  • CodeEmperor
  • 2016年04月10日 14:48
  • 1077

设计一个有getMin功能的栈

题目:实现一个特殊的栈,在实现栈的基础上能够实现返回栈中最小元素的操作。 要求:① pop、push、getMin 操作的时间复杂度都是 O(1)          ② 设计的栈类型可以使用现成的栈结...
  • u011204487
  • u011204487
  • 2016年05月23日 16:27
  • 329

设计一个有getMin功能的栈

题目:实现一个特殊的栈,在实现栈的基础上能够实现返回栈中最小元素的操作。 要求:① pop、push、getMin 操作的时间复杂度都是 O(1)          ② 设计的栈类型可以使用现成的栈结...
  • u011204487
  • u011204487
  • 2016年05月23日 16:27
  • 329

[算法最优]设计一个有getMin功能的栈

题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求:1、pop、push、getMin操作的时间复杂度都是O(1) 2、设计的栈类型可以输用现成的栈结构首先看下...
  • CodeEmperor
  • CodeEmperor
  • 2016年04月10日 14:48
  • 1077

程序员面试指南之设计一个有GetMin功能的栈

题目描述:解题思路:  我们可以设计两个栈:StackDate和StackMin,一个就是普通的栈,另外一个存储push进来的最小值。首先是push操作:  每次压入的数据newNum都push进St...
  • lks1139230294
  • lks1139230294
  • 2016年10月12日 20:19
  • 107

设计一个有getMin功能的栈

题目:  实现一个特殊的栈,在实现栈的基本功能基础上,在实现返回栈中最小元素的操作。 代码: #include #include typedef struct stack { int d...
  • u011558673
  • u011558673
  • 2016年11月09日 09:39
  • 110

栈和队列面试题之--实现一个有getMin功能的栈

题目:实现一个特殊的栈,在实现栈基本功能的恶基础上,再实现返回栈中的最小元素操作 要求:pop push getMin操作的时间复杂度都是O(1) 看到题目可以想到大体分为两种思路,一是通过一个...
  • yueyueLEMON
  • yueyueLEMON
  • 2016年07月20日 09:44
  • 487

设计一个有getMin功能的栈

问题描述: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。...
  • L_kanglin
  • L_kanglin
  • 2017年03月15日 10:22
  • 245

设计一个有getMin功能的栈

题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 要求: 1、pop、push、getMin操作的时间复杂度都是O(1)  2、设计的栈类型...
  • LQSLM
  • LQSLM
  • 2017年04月02日 20:47
  • 139

设计一个有getMin功能的栈

*题目* 实现一个特殊的栈,在实现栈的基础功能的基础上,再实现返回栈中最小元素的操作。 *要求* pop、push、getMin操作的时间复杂度都是O(1)。设计的栈类型可以使用现成的栈结构。 ...
  • xuanlang39
  • xuanlang39
  • 2016年11月22日 23:51
  • 97
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计一个有getMin功能的栈
举报原因:
原因补充:

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