用两个栈实现队列

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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<Integer> inStack ;
    //private Deque<Integer> inStack;
    private Stack<Integer> outStack ;
    //private Deque<Integer> 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();
            }
            
        }
    }
}

我翻了翻力扣的评论,发现大家都是队列Deque实现Stack,对此,我很疑惑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值