• 一、题目
  • 二、解题思路
  • 三、解题代码

    一、题目

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小数的min 函数。在该栈中,调用min、push 及pop的时间复杂度都是O(1)。

    二、解题思路

    把每次的最小元素(之前的最小元素和新压入战的元素两者的较小值)都保存起来放到另外一个辅助栈里。

    如果每次都把最小元素压入辅助栈, 那么就能保证辅助栈的栈顶一直都是最小元素.当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。

    三、解题代码

    1. public class MinStack {
    2. private Stack<Integer> stack = new Stack<Integer>();
    3. private Stack<Integer> minStack = new Stack<Integer>(); //辅助栈:栈顶永远保存stack中当前的最小的元素
    4. public void push(int data) {
    5. stack.push(data); //直接往栈中添加数据
    6. //在辅助栈中需要做判断
    7. if (minStack.size() == 0 || data < minStack.peek()) {
    8. minStack.push(data);
    9. } else {
    10. minStack.add(minStack.peek()); //【核心代码】peek方法返回的是栈顶的元素
    11. }
    12. }
    13. public int pop() throws Exception {
    14. if (stack.size() == 0) {
    15. throw new Exception("栈中为空");
    16. }
    17. int data = stack.pop();
    18. minStack.pop(); //核心代码
    19. return data;
    20. }
    21. public int min() throws Exception {
    22. if (minStack.size() == 0) {
    23. throw new Exception("栈中空了");
    24. }
    25. return minStack.peek();
    26. }
    27. }