• 用两个栈实现队列


    题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

    再做题之前,先来梳理一下知识点,何为栈,何为队列

    • 栈:先进后出(jvm栈即是java虚拟机栈,它是jvm中的一块内存,该内存一般用来存放局部变量)
      • 常用方法:
        • E push(E item):放入元素
        • E pop():获取栈顶元素并弹出
        • E peek():获取栈顶元素
        • boolean isEmpty():判断栈是否为空
    • 队列:先进先出(只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表)
      • 入队列:进行插入操作的一端称为队尾
      • 出队列:进行删除操作的一端称为对头
      • 普通队列(Queue):队尾进对头出 Queue queue = new LinkedList<>()
      • 双端队列(Deque)队尾/头进,队尾/头出 Deque deque = new LinkedList<>()
      • 常用方法:
        • 普通队列Queue
          • offer(e):入队列,队尾入
          • poll():出队列,对头出,弹出队尾元素并返回
          • peek():获取队头元素
        • 双端队列Deque
          • offer(e):默认队尾入
          • offerFirst(e):对头入
          • offerLast(e):队尾入
          • peekFirst():获取队头元素
          • peekLast():获取队尾元素
          • pollFirst():弹出对头元素并返回
          • pollLast():弹出队尾元素并返回


            appendTail 是队尾入,deleteHead 是对头出,所以题目中的队列是普通队列,用两个栈来实现普通队列,那么一个栈做输入数据操作,一个栈做输出数据操作,当输出栈为空的时候,将输入栈中的数据全部放入输出栈中,栈是先进后出,到了两次之后,那么就实现队列的先进先出。

    代码如下:

    class CQueue {
        private Stack inStack ;
        //private Deque inStack;
        private Stack outStack ;
        //private Deque outStack;
        public CQueue() {
            inStack = new Stack<>();//new ArrayDeque<>()
            outStack = new Stack<>();
        }
        
        public void appendTail(int value) {
            inStack.push(value);
        }
        
        public int deleteHead() {
            if(!outStack.isEmpty()){
                return outStack.pop();
            }else{
                if(inStack.isEmpty()){
                    return -1;
                    
                }else{
                    while(!inStack.isEmpty()){
                        outStack.push(inStack.pop());
                    }
                    return outStack.pop();
                }
                
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    我翻了翻力扣的评论,发现大家都是队列Deque实现Stack,对此,我很疑惑。
  • 相关阅读:
    C++之STL中vector的使用
    用递归函数遍历判断同一层级某个属性值是否相同
    什么叫 “雪碧图”?
    在 android 上使用 adb client
    简要解析盒子模型
    驱动开发,IO模型之IO多路复用实现过程,select方式
    python使用第三方库PyPDF2、PDFMiner或pdfplumber来解析PDF文件
    python的decord库存在内存泄漏
    Jmeter压力测试教程(上)
    必知必会打包工具tsup原理解析
  • 原文地址:https://blog.csdn.net/m0_46287385/article/details/126745854