【算法】使用队列制作一个栈

文章目录

  • 前言
  • 两个队列形成一个栈
  • 一个队列形成一个栈

前言

栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。

队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。

方法一:两个队列
为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中pushQueue用于存储栈内的元素,popQueue作为入栈操作的辅助队列。

入栈操作时,首先将元素入队到 pushQueue ,然后将 popQueue的全部元素依次出队并入队到
pushQueue,此时pushQueue 的前端的元素即为新入栈的元素,再将 pushQueue和 popQueue互换,则popQueue的元素即为栈内的元素,popQueue的前端和后端分别对应栈顶和栈底。
由于每次入栈操作都确保popQueue的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 popQueue的前端元素并返回即可,获得栈顶元素操作只需要获得popQueue的前端元素并返回即可(不移除元素)。
由于 popQueue用于存储栈内的元素,判断栈是否为空时,只需要判断popQueue是否为空即可。

两个队列形成一个栈

  1. package com.base.learn.queue;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. /**
  5. * @author: 张锦标
  6. * @date: 2023/6/10 10:33
  7. * QueueMakeStack类
  8. */
  9. public class TwoQueueMakeStack {
  10. //每次最新元素都插入到pushQueue中
  11. private Queue<Integer> pushQueue;
  12. //出栈的时候使用这个popQueue,用于存放老旧元素
  13. private Queue<Integer> popQueue;
  14. public TwoQueueMakeStack() {
  15. pushQueue = new LinkedList<Integer>();
  16. popQueue = new LinkedList<Integer>();
  17. }
  18. public void push(int x) {
  19. //pushQueue.offer(x);
  20. //while(!popQueue.isEmpty()){
  21. // pushQueue.offer(popQueue.poll());
  22. //}
  23. //Queue<Integer> temp = popQueue;
  24. //popQueue = pushQueue;
  25. //pushQueue = temp;
  26. //一个队列也可以实现栈
  27. int size = popQueue.size();
  28. popQueue.offer(x);
  29. for(int i=0;i<size;i++){
  30. popQueue.offer(popQueue.poll());
  31. }
  32. }
  33. public int pop() {
  34. return popQueue.poll();
  35. }
  36. public int top() {
  37. return popQueue.peek();
  38. }
  39. public boolean empty() {
  40. return popQueue.isEmpty();
  41. }
  42. }

一个队列形成一个栈

方法一使用了两个队列实现栈的操作,也可以使用一个队列实现栈的操作。

使用一个队列时,为了满足栈的特性,即最后入栈的元素最先出栈,同样需要满足队列前端的元素是最后入栈的元素。

入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前
n 个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。

由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。

由于队列用于存储栈内的元素,判断栈是否为空时,只需要判断队列是否为空即可。

  1. package com.base.learn.queue;
  2. import java.util.LinkedList;
  3. import java.util.Queue;
  4. /**
  5. * @author: 张锦标
  6. * @date: 2023/6/10 10:44
  7. * OneQueueMakeStack类
  8. */
  9. public class OneQueueMakeStack {
  10. private Queue<Integer> queue ;
  11. public OneQueueMakeStack(){
  12. queue = new LinkedList<Integer>();
  13. }
  14. public void push(int x){
  15. int size = queue.size();
  16. queue.offer(x);
  17. for(int i=0;i<size;i++){
  18. queue.offer(queue.poll());
  19. }
  20. }
  21. public int pop(){
  22. return queue.poll();
  23. }
  24. public int top(){
  25. return queue.peek();
  26. }
  27. public boolean empty(){
  28. return queue.isEmpty();
  29. }
  30. }

发表评论

表情:
评论列表 (有 0 条评论,33人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用两个队列实现一个

    两个队列实现一个栈 队列是先进先出,而栈是先进后出;考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头; 由于栈的pop弹出栈顶元素,而队列的pop也是弹出栈顶元

    相关 用两个实现一个队列算法

    栈:后进先出,队列:先进先出。 用两个栈实现一个队列,主要实现队列中的两个函数,appendTail,尾部追加,deleteHead,在头部删除节点, 用了一个模板类,队列

    相关 两个构成一个队列算法

      在《剑指Offer》中看到了一个算法:用两个栈实现一个队列。然后我就在思考这个要怎么实现,队列的特点是先进先出,而栈的特点是先进后出,与队列恰好相反。   但是如果是两