1 题目:

实现一个栈, 该栈带有出栈(pop), 入栈(push), 取最小元素(getMin)3个方法. 并且要保证3个方法的时间复杂度都是O(1)

2 思路:

  1. 1.创建两个栈, A和备胎栈B, 并且我们的目标是让所有的最小元素全部存放在栈B.<br /> 2.第一个元素进入栈A, 此时只有一个元素, 最小元素就是第一个元素, 所以, 让新元素也进入栈B.


3.每当有新元素进入栈A, 则新元素和A的最小值进行比较, 即和栈B的栈顶元素比较, 如果小于B的栈 顶元素, 则让其进行栈B.那么此时栈B的栈顶元素就是栈A的最小元素值
image-20210426201749238.png
(3) 时间复杂度: 进栈, 出栈, 取最小值的时间复杂度都是O(1)


空间复杂度: 最坏情况的空间复杂度是O(n)

3.代码

  1. package com.xiaoxuanfeng.arithmetic;
  2. import java.util.Stack;
  3. // 最小栈的实现
  4. public class TheRealizationOfSmallestStack {
  5. // 1.创建两个栈, 一个主栈 mainStack, 一个辅肋栈minStack
  6. Stack<Integer> mainStack = new Stack<>();
  7. Stack<Integer> minStack = new Stack<>();
  8. // 2.入栈方法
  9. public void push(int element) {
  10. mainStack.push(element);
  11. // 如果minStack 为空, 或者element <= minStack.peek()
  12. if (minStack.isEmpty() || element <= minStack.peek()) {
  13. minStack.push(element);
  14. }
  15. }
  16. // 3.出栈方法
  17. public void pop() {
  18. // 如果主栈当前的栈顶元素 == 辅助的栈顶元素,
  19. if (mainStack.peek() == minStack.peek()) {
  20. minStack.pop();
  21. }
  22. mainStack.pop();
  23. }
  24. // 4.取最小值方法
  25. public int getMin() throws Exception {
  26. // 首先判断主栈是否为空
  27. if (mainStack.isEmpty()) {
  28. throw new Exception("mainStack is empty");
  29. }
  30. return minStack.peek();
  31. }
  32. // 5.测试
  33. public static void main(String[] args) throws Exception {
  34. // 创建最小栈
  35. TheRealizationOfSmallestStack minStack = new TheRealizationOfSmallestStack();
  36. minStack.push(8);
  37. minStack.push(2);
  38. minStack.push(3);
  39. minStack.pop();
  40. // 打印结果
  41. System.out.println("最小栈的目前最小值是:" + minStack.getMin());
  42. }
  43. }