题目描述(简单难度)

225. Implement Stack using Queues - 图1

用队列实现栈的功能,队列我们只能调用 push to back, peek/pop from front, size, and is empty 的操作。

解法一

来一个简单粗暴的方法,粗暴到我开始怀疑我理解错了题意。

首先肯定是用 queue 去保存我们的数据,push 的话正常的加到队列。

至于 pop 的话,因为队列是先进先出,栈是先进后出,所以此时我们应该将队列最后一个元素出队列。我们只需要将队列中除去最后一个元素,其他元素全部出队列,剩下的最后一个就是我们要弹出的。然后把之前出了队列的元素再保存起来即可。

然后 top 的话和 pop 同理。

  1. class MyStack {
  2. Queue<Integer> queue;
  3. /** Initialize your data structure here. */
  4. public MyStack() {
  5. queue = new LinkedList<>();
  6. }
  7. /** Push element x onto stack. */
  8. public void push(int x) {
  9. queue.offer(x);
  10. }
  11. /** Removes the element on top of the stack and returns that element. */
  12. public int pop() {
  13. Queue<Integer> temp = new LinkedList<>();
  14. //只剩下最后一个元素
  15. while (queue.size() > 1) {
  16. temp.offer(queue.poll());
  17. }
  18. //去除最后一个元素
  19. int remove = queue.poll();
  20. //原来的元素还原
  21. while (!temp.isEmpty()) {
  22. queue.offer(temp.poll());
  23. }
  24. return remove;
  25. }
  26. /** Get the top element. */
  27. public int top() {
  28. Queue<Integer> temp = new LinkedList<>();
  29. while (queue.size() > 1) {
  30. temp.offer(queue.poll());
  31. }
  32. int top = queue.poll();
  33. temp.offer(top);
  34. while (!temp.isEmpty()) {
  35. queue.offer(temp.poll());
  36. }
  37. return top;
  38. }
  39. /** Returns whether the stack is empty. */
  40. public boolean empty() {
  41. return queue.isEmpty();
  42. }
  43. }
  44. /**
  45. * Your MyStack object will be instantiated and called as such:
  46. * MyStack obj = new MyStack();
  47. * obj.push(x);
  48. * int param_2 = obj.pop();
  49. * int param_3 = obj.top();
  50. * boolean param_4 = obj.empty();
  51. */

上边代码的受到 这里 的启发,可以稍微优化一下,去掉 temp。我们可以边删除边添加。

  1. class MyStack {
  2. Queue<Integer> queue;
  3. /** Initialize your data structure here. */
  4. public MyStack() {
  5. queue = new LinkedList<>();
  6. }
  7. /** Push element x onto stack. */
  8. public void push(int x) {
  9. queue.offer(x);
  10. }
  11. /** Removes the element on top of the stack and returns that element. */
  12. public int pop() {
  13. int size = queue.size();
  14. while (size > 1) {
  15. queue.offer(queue.poll());
  16. size--;
  17. }
  18. return queue.poll();
  19. }
  20. /** Get the top element. */
  21. public int top() {
  22. int size = queue.size();
  23. while (size > 1) {
  24. queue.offer(queue.poll());
  25. size--;
  26. }
  27. int top = queue.poll();
  28. queue.offer(top);
  29. return top;
  30. }
  31. /** Returns whether the stack is empty. */
  32. public boolean empty() {
  33. return queue.isEmpty();
  34. }
  35. }
  36. /**
  37. * Your MyStack object will be instantiated and called as such:
  38. * MyStack obj = new MyStack();
  39. * obj.push(x);
  40. * int param_2 = obj.pop();
  41. * int param_3 = obj.top();
  42. * boolean param_4 = obj.empty();
  43. */

解法二

参考 这里,一个非常巧妙优雅的方法。只针对 push 做特殊化处理,其他函数直接返回就可以。

每次 push 一个新元素之后,我们把队列中其他的元素重新排到新元素的后边。

  1. class MyStack {
  2. Queue<Integer> queue;
  3. /** Initialize your data structure here. */
  4. public MyStack() {
  5. queue = new LinkedList<>();
  6. }
  7. /** Push element x onto stack. */
  8. public void push(int x) {
  9. queue.offer(x);
  10. int size = queue.size();
  11. while (size > 1) {
  12. queue.offer(queue.poll());
  13. size--;
  14. }
  15. }
  16. /** Removes the element on top of the stack and returns that element. */
  17. public int pop() {
  18. return queue.poll();
  19. }
  20. /** Get the top element. */
  21. public int top() {
  22. return queue.peek();
  23. }
  24. /** Returns whether the stack is empty. */
  25. public boolean empty() {
  26. return queue.isEmpty();
  27. }
  28. }
  29. /**
  30. * Your MyStack object will be instantiated and called as such:
  31. * MyStack obj = new MyStack();
  32. * obj.push(x);
  33. * int param_2 = obj.pop();
  34. * int param_3 = obj.top();
  35. * boolean param_4 = obj.empty();
  36. */

这道题的话最大的作用就是去理解队列和栈的特性吧,实际中没必要用队列去实现栈,何必呢。

leetcode 上还有很多其他的解法,这里也就不介绍了,基本上看了作者的代码就能明白作者的想法了。解法二应该就是相对来说最完美的解法了。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情