剑指offer----包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

方法一:
费时间,省空间

import java.util.Stack;

public class Solution {
    private Stack<Integer> stackData = new Stack<>();
    private Stack<Integer> stackMin= new Stack<>();
    
    public void push(int node) {
        stackData.push(node);
        if(stackMin.empty()||node <= min()){
            stackMin.push(node);
        }
    }  
    public void pop() {
        if(stackData.empty()){
            return;
        }
        if(stackData.pop() == min()){
            stackMin.pop();
        }
    }
    
    public int top() {
        return stackData.peek();
    }
    
    public int min() {
        return stackMin.peek();
    }
}

方法二
费空间,省时间。

import java.util.Stack;

public class Solution {
    private Stack<Integer> stackData = new Stack<>();
    private Stack<Integer> stackMin= new Stack<>();
    public void push(int node) {
        stackData.push(node);
        if(stackMin.empty() || node < min()){
            stackMin.push(node);
        }else{
            stackMin.push(min());
        }
    }
    public void pop() {
        stackData.pop();
        stackMin.pop();
    }
    public int top() {
        return stackData.peek();
    }
    public int min() {
        return stackMin.peek();
    }
}

以上两种方法,均使用了两个栈来实现,data栈用例正常存储数据,min栈用来记录最小值。
方法一是每次压入数据栈之后与min栈顶比较,如果小于等于min栈顶,就压入,否则不则不压入,数据栈出栈的时候也要进行判断是否将min栈中的数据弹出。
方法二时每次压入数据栈之后与min栈顶比较,如果小于等于min栈顶 压入该值,再把min栈顶的值压入min一次。出栈时不需要判断,直接同步弹出。

推荐阅读更多精彩内容