栈和队列----设计一个有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 Stack<Integer>();
    Stack<Integer> stackMin = new Stack<Integer>();

    //在入栈时,如果stackMin是空,同步压入,
    //如果不是空,但是新元素小于等于stackMin的栈顶元素,也同步压入
    //如果不是空,新元素大于stackMin的栈顶元素,就不压入 stackMin
    //这样就可以保证stackMIn中的元素依次减少
    public void push(int newNum){
        if(stackMin.isEmpty()){
            stackMin.push(newNum);
        }else if (newNum<=stackMin.peek()){
            stackMin.push(newNum);
        }
        stackData.push(newNum);
    }

    //出栈和入栈是相对应的
    //stackData中的栈顶元素只会大于等于stackMin栈顶元素
    //如果大于,只弹出stackData的栈顶元素,如果等于,两个的栈顶元素都要弹出
    public int pop(){
        if(stackData.isEmpty()){
            throw new RuntimeException("Your stack is empty.");
        }
        int value = stackData.pop();
        if(value==stackMin.peek()){
            stackMin.pop();
        }
        return value;
    }

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

 

posted @ 2018-07-08 13:06  Demrystv  阅读(136)  评论(0编辑  收藏  举报