155-最小栈

思路:

  • minStack 只放入最小值。
  • minStack 和 dataStack 同时放入值。

image.png
代码:

  1. public class MinStack_155 {
  2. Deque<Integer> xStack;
  3. Deque<Integer> minStack;
  4. /** initialize your data structure here. */
  5. public MinStack_155() {
  6. xStack = new LinkedList<>();
  7. minStack = new LinkedList<>();
  8. minStack.push(Integer.MAX_VALUE);
  9. }
  10. public void push(int val) {
  11. xStack.push(val);
  12. if (!minStack.isEmpty())
  13. minStack.push(Math.min(val, minStack.peek()));
  14. else
  15. minStack.push(val);
  16. }
  17. public void pop() {
  18. if (!xStack.isEmpty() && !minStack.isEmpty()) {
  19. xStack.pop();
  20. minStack.pop();
  21. }
  22. }
  23. public int top() {
  24. return xStack.peek();
  25. }
  26. public int getMin() {
  27. return minStack.peek();
  28. }
  29. public static void main(String[] args) {
  30. MinStack_155 minStack = new MinStack_155();
  31. minStack.push(-2);
  32. minStack.push(0);
  33. minStack.push(-3);
  34. System.out.println(minStack.getMin()); //--> 返回 -3.
  35. minStack.pop();
  36. System.out.println(minStack.top()); //--> 返回 0.
  37. System.out.println(minStack.getMin()); //--> 返回 -2.
  38. }
  39. }

232-用栈实现队列

image.png
代码:

  1. public class StackToQueue_232 {
  2. Deque<Integer> inStack;
  3. Deque<Integer> outStack;
  4. public StackToQueue_232() {
  5. inStack = new LinkedList<>();
  6. outStack = new LinkedList<>();
  7. }
  8. public void push(int x) {
  9. inStack.push(x);
  10. }
  11. public int pop() {
  12. if (outStack.isEmpty()) {
  13. in2out();
  14. }
  15. return outStack.pop();
  16. }
  17. public int peek() {
  18. if (outStack.isEmpty()) {
  19. in2out();
  20. }
  21. return outStack.peek();
  22. }
  23. public boolean empty() {
  24. return inStack.isEmpty() && outStack.isEmpty();
  25. }
  26. public void in2out () {
  27. while (!inStack.isEmpty()) {
  28. outStack.push(inStack.pop());
  29. }
  30. }
  31. public static void main(String[] args) {
  32. StackToQueue_232 myQueue = new StackToQueue_232();
  33. myQueue.push(1); // queue is: [1]
  34. myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
  35. // myQueue.printQueue();
  36. System.out.println(myQueue.peek()); // return 1
  37. System.out.println(myQueue.pop()); // return 1, queue is [2]
  38. System.out.println(myQueue.pop());
  39. System.out.println(myQueue.empty()); // return false
  40. }
  41. }

225-用队列实现栈

image.png
代码:

  1. public class QueueToStack_225 {
  2. /**
  3. * queue1 作为出栈元素的队列
  4. * queue2 作为入栈元素的辅助队列,并且入栈操作后 queue2 永远是空队列
  5. */
  6. Queue<Integer> queue1;
  7. Queue<Integer> queue2;
  8. public QueueToStack_225() {
  9. queue1 = new LinkedList<>();
  10. queue2 = new LinkedList<>();
  11. }
  12. public void push(int x) {
  13. queue2.offer(x);
  14. while (!queue1.isEmpty()) {
  15. queue2.offer(queue1.poll());
  16. }
  17. // 交换 queue1 和 queue2 队列
  18. Queue<Integer> tmp = queue1;
  19. queue1 = queue2;
  20. queue2 = tmp;
  21. }
  22. public int pop() {
  23. return queue1.poll();
  24. }
  25. public int top() {
  26. return queue1.peek();
  27. }
  28. public boolean empty() {
  29. return queue1.isEmpty();
  30. }
  31. public static void main(String[] args) {
  32. QueueToStack_225 myStack = new QueueToStack_225();
  33. myStack.push(1);
  34. myStack.push(2);
  35. System.out.println(myStack.top()); // 返回 2
  36. System.out.println(myStack.pop()); // 返回 2
  37. myStack.empty(); // 返回 False
  38. }
  39. }