剑指offer 30:包含min 函数的栈

package com.example.lettcode.offer;

import java.util.Stack;

/**
 * @Class MinStack
 * @Description 剑指offer 30 包含min 函数的栈
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,
 * 调用 min、push 及 pop 的时间复杂度都是 O(1)。
 * 示例:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.min();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.min();   --> 返回 -2.
 * @Author
 * @Date 2020/7/17
 **/
public class MinStack {

    // 保存入栈的元素
    public Stack<Integer> data;
    // 保存最小元素
    public Stack<Integer> min;

    /**
     * initialize your data structure here.
     */
    public MinStack() {
        data = new Stack<>();
        min = new Stack<>();
    }


    /** 定义两个stack,一个为存放最小数的序列的辅助栈。
     * 压栈时,先将元素 x 压入 stack1。然后判断 stack2 的情况:
     * stack2 栈为空或者栈顶元素大于 x,则将 x 压入 stack2 中。
     * stack2 栈不为空且栈定元素小于 x,则重复压入栈顶元素。
     * 获取最小元素时,从 stack2 中获取栈顶元素即可。
     **/
    public void push(int x) {
        // min 栈保存的一直是date栈中入栈时的最小元素,两个栈的个数相同
        // add是继承自Vector的方法,且返回值类型是boolean。
        // push是Stack自身的方法,返回值类型是参数类类型。
        data.push(x);
        if (min.size() == 0 || min.peek() > x) {
            min.push(x);
        }else {
            min.push(min.peek());
        }
    }

    public void pop() {
        // pop()函数返回栈顶的元素,并且将该栈顶元素出栈。
        data.pop();
        min.pop();
    }

    public int top() {
        // peek()函数返回栈顶的元素,但不弹出该栈顶元素。
        return data.peek();
    }

    public int min() {
        return min.peek();
    }
}
// 测试用例
public static void main(String[] args) {
	MinStack minStack = new MinStack();
	minStack.push(-2);
	minStack.push(0);
	minStack.push(-3);
	System.out.println(minStack.min());
	minStack.pop();
	System.out.println(minStack.top());
	System.out.println(minStack.min());
}
原文地址:https://www.cnblogs.com/fyusac/p/13330231.html