美文网首页
设计一个有getMin功能的栈

设计一个有getMin功能的栈

作者: Tank_Mao | 来源:发表于2020-09-25 16:53 被阅读0次

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

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

【解答】
使用两个栈,stackData用来保存当前栈的元素,其功能和一个正常的栈没有区别;stackMin用来保存每一步的最小值。

package pers.mao.stackAndQueue.demo_01;

import java.util.Stack;

/**
 * @author Mao Qingbo
 * @date 2020-09-25
 */
public class MyStack {
    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    public MyStack() {
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }

    /**
     * 压入规则:
     * 如果stackMin为空,将newNum压入stackMin
     * 如果stackMin不为空,比较newNum和stackMin的大小:
     *   若 newNum<=stackMin.peek(),newNum压入stackMin;
     *   若 newNum>stackMin.peek(),stackMin不压入任何内容。
     * @param newNum 当前数据
     */
    public void push(int newNum){
        if(this.stackMin.isEmpty()){
            this.stackMin.push(newNum);
        }
        else if(newNum<=this.stackData.peek()){
            this.stackMin.push(newNum);
        }
        this.stackData.push(newNum);
    }

    /**
     * 弹出规则:
     * 若stackData栈顶元素=stackMin栈顶元素,将stackMin栈顶元素弹出;
     * 若stackData栈顶元素>stackMin栈顶元素,stackMin不弹出任何内容。
     * @return 弹出栈顶元素
     */
    public int pop(){
        if(this.stackData.isEmpty()){
            throw new RuntimeException("Your stack is empty!");
        }
        int value = this.stackData.pop();
        if(value==this.stackMin.peek()){
            this.stackMin.pop();
        }
        return value;
    }

    /**
     * @return 返回stackMin栈顶元素
     */
    public int getMin(){
        if(this.stackMin.isEmpty()){
            throw new RuntimeException("Your stack is empty!");
        }
        return this.stackMin.peek();
    }
}

相关文章

网友评论

      本文标题:设计一个有getMin功能的栈

      本文链接:https://www.haomeiwen.com/subject/invfuktx.html