一、题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小数的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. }