当前位置:   article > 正文

双队列实现栈?双栈实现队列?

双栈实现队列

目录

双队列实现栈

最容易理解的办法

单队列实现栈

双栈实现队列

最容易理解的办法


双队列实现栈

如下分析(例如出栈

注意:

  • 哪个队列不为空就放入哪个将元素放入哪个队列
  • 若两个都为空,任选一个队列放入即可 

如下代码:

  1. class MyStack {
  2. public Queue<Integer> q1;
  3. public Queue<Integer> q2;
  4. public int usedSize;
  5. public MyStack() {
  6. q1 = new LinkedList<>();
  7. q2 = new LinkedList<>();
  8. }
  9. //压栈
  10. public void push(int x) {
  11. //哪个队列不为空,往那里里面放,都为空就放q1
  12. if(!q1.isEmpty()){
  13. q1.offer(x);
  14. }
  15. else if(!q2.isEmpty()){
  16. q2.offer(x);
  17. }
  18. else{
  19. q1.offer(x);
  20. }
  21. usedSize++;
  22. }
  23. //出栈
  24. public int pop() {
  25. //哪个队列不为空,就从哪里取元素放到另一个队列里
  26. if(empty()){
  27. return -1;
  28. }
  29. if(!q1.isEmpty()){
  30. //转移usedSize - 1个元素到另一个队列
  31. //for(int i = 0; i < usedSize - 1; i++)//不能这样写,usedSize会随着出栈不断减少
  32. int size = usedSize;
  33. for(int i = 0; i < size - 1; i++){
  34. q2.offer(q1.poll());
  35. }
  36. usedSize--;
  37. return q1.poll();
  38. }
  39. else{
  40. int size = usedSize;
  41. for(int i = 0; i < size - 1; i++){
  42. q1.offer(q2.poll());
  43. }
  44. usedSize--;
  45. return q2.poll();
  46. }
  47. }
  48. public int top() {
  49. //哪个队列不为空,就从哪里取元素放到另一个队列里
  50. if(empty()){
  51. return -1;
  52. }
  53. int tmp = 0;
  54. if(!q1.isEmpty()){
  55. int size = usedSize;
  56. for(int i = 0; i < size - 1; i++){
  57. q2.offer(q1.poll());
  58. }
  59. tmp = q1.peek();
  60. q2.offer(q1.poll());
  61. }
  62. else{
  63. int size = usedSize;
  64. for(int i = 0; i < size - 1; i++){
  65. q1.offer(q2.poll());
  66. }
  67. tmp = q2.peek();
  68. q1.offer(q2.poll());
  69. }
  70. return tmp;
  71. }
  72. //判空
  73. public boolean empty() {
  74. return usedSize == 0;
  75. }
  76. }

最容易理解的办法

画个图就清楚啦~

  1. class MyStack {
  2. private Queue<Integer> queue1 = new LinkedList<>();
  3. private Queue<Integer> queue2 = new LinkedList<>();
  4. public MyStack() {
  5. }
  6. public void push(int x) {
  7. while(!queue1.isEmpty()) {
  8. queue2.offer(queue1.poll());
  9. }
  10. queue1.offer(x);
  11. while(!queue2.isEmpty()) {
  12. queue1.offer(queue2.poll());
  13. }
  14. }
  15. public int pop() {
  16. return queue1.poll();
  17. }
  18. public int top() {
  19. return queue1.peek();
  20. }
  21. public boolean empty() {
  22. return queue1.isEmpty();
  23. }
  24. }

队列实现栈

实际上,单个队列也可以实现栈,每次入栈前都需要看一下栈里有多少个元素,然后先把需要入栈的元素入栈后,按顺序弹出之前记录的元素个数,就可以维持一个栈结构了.

  1. class MyStack {
  2. private Queue<Integer> queue;
  3. public MyStack() {
  4. this.queue = new LinkedList<>();
  5. }
  6. public void push(int x) {
  7. queue.offer(x);
  8. for(int i = 0; i < queue.size() - 1; i++) {
  9. queue.offer(queue.poll());
  10. }
  11. }
  12. public int pop() {
  13. return queue.poll();
  14. }
  15. public int top() {
  16. return queue.peek();
  17. }
  18. public boolean empty() {
  19. return queue.isEmpty();
  20. }
  21. }


双栈实现队列

单个栈是无法实现队列的,双栈是可以的,如下分析(例如出队

 注意:

  • 出队之前一定要先检查s2中是否有元素,若有直接弹出即可,若没有再将s1全部压入s2中
  • 检查队列首元素也是如此(peek)

代码如下:

  1. class MyQueue {
  2. public Stack<Integer> s1;//入栈
  3. public Stack<Integer> s2;//出栈
  4. public MyQueue() {
  5. this.s1 = new Stack<>();
  6. this.s2 = new Stack<>();
  7. }
  8. //进队
  9. public void push(int x) {
  10. s1.push(x);
  11. }
  12. //出队
  13. public int pop() {
  14. if(empty()) {
  15. return -1;
  16. }
  17. //s2如同蓄水池,一旦要出队列,就全压s1
  18. //前提一定要是s2为空!若不为空,再压入s2,顺序就不一样!
  19. if(s2.empty()){
  20. while(!s1.empty()) {
  21. s2.push(s1.pop());
  22. }
  23. return s2.pop();
  24. }
  25. //如果s2里有元素,就直接弹出
  26. return s2.pop();
  27. }
  28. public int peek() {
  29. if(empty()) {
  30. return -1;
  31. }
  32. //s2如同蓄水池,一旦要出队列,就全压s1
  33. //前提一定要是s2为空!若不为空,再压入s2,顺序就不一样!
  34. if(s2.empty()){
  35. while(!s1.empty()) {
  36. s2.push(s1.pop());
  37. }
  38. return s2.peek();
  39. }
  40. //如果s2里有元素,就直接弹出
  41. return s2.peek();
  42. }
  43. public boolean empty() {
  44. return s1.empty() && s2.empty();
  45. }
  46. }

最容易理解的办法

画个图就知道了~

  1. class MyQueue {
  2. private Stack<Integer> stack1 = new Stack<>();
  3. private Stack<Integer> stack2 = new Stack<>();
  4. public MyQueue() {
  5. }
  6. public void push(int x) {
  7. while(!stack1.isEmpty()) {
  8. stack2.push(stack1.pop());
  9. }
  10. stack1.push(x);
  11. while(!stack2.isEmpty()) {
  12. stack1.push(stack2.pop());
  13. }
  14. }
  15. public int pop() {
  16. return stack1.pop();
  17. }
  18. public int peek() {
  19. return stack1.peek();
  20. }
  21. public boolean empty() {
  22. return stack1.isEmpty();
  23. }
  24. }


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号