包含getMin函数的栈

第十九题:设计一个包含getMin函数的栈

 

 

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

 

 

解析:

          这题的思路与之前的一道题很像(用两个栈实现队列)

          本题还是使用两个栈空间,stackA用来存储压栈数据,stackB用来存储栈内的最小值(从栈顶到栈底,依次递增)

 

 

具体实现如下图所示:

 

包含getMin函数的栈_第1张图片

 

 

具体实现代码如下:

 

//两个栈实现
public class MinStack {

    /**
     * 使用一个额外的栈,用来存储最小值
     */
    private Stack minStack = new Stack<>();

    /**
     * 用于用于存储压栈的数字
     */
    private Stack dataStack = new Stack<>();


    public void push(Integer num){
        dataStack.push(num);
        if (minStack.isEmpty()){
            minStack.push(num);
        }else if (minStack.peek() > dataStack.peek()){
            minStack.push(num);
        }else {
            minStack.push(minStack.peek());
        }
    }


    public Integer pop() throws Exception {
        if (dataStack.empty()){
            throw new RuntimeException("dataStack is empty");
        }
        minStack.pop();
        return dataStack.pop();
    }


    public Integer peek() throws Exception {
        if (dataStack.empty()){
            throw new RuntimeException("dataStack is empty");
        }
        return dataStack.peek();
    }


    public Integer getMin(){
        if (minStack.empty()){
            throw new RuntimeException("minStack is empty");
        }
        return minStack.peek();
    }


}


//两个集合实现
public class Solution {

    /**
     * 用于用于存储压栈的数字
     */
    private ArrayList dataList = new ArrayList<>();
    /**
     * 使用一个额外的集合,用来存储最小值
     */
    private ArrayList minList = new ArrayList<>();
    private Integer min = Integer.MAX_VALUE;
    
    public void push(int node) {
        dataList.add(node);
        if (node <= min) {
            minList.add(node);
            min = node;
        }
        else {
            minList.add(min);
        }
    }
    
    public int getSize() {
        return dataList.size();
    }
    
    public void pop() {
        int end = getSize() - 1;
        dataList.remove(end);
        minList.remove(end);
        min = minList.get(getSize() - 1);
    }
    
    public int top() {
        return dataList.get(getSize() - 1);
    }
    
    public int min() {
        return min;
    }
}

 

NowCoder(Online Coding, Please Click)

 

你可能感兴趣的:(剑指offer)