用两个栈实现队列_力扣

文章目录

  • 1. 题目
    • 1. 题目描述
    • 2. 输入和输出
  • 2. 题目分析
  • 3. 代码实现

用两个栈实现队列_力扣

1. 题目

1. 题目描述

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

2. 输入和输出

  • 示例1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
  • 示例2;
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

2. 题目分析

  • 首先看清楚题目让我们做什么?用两个栈实现队列,那么栈和队列有什么共同点吗?有,栈是"先进后出",队列是"先进先出",那么既然要让我们用两个栈实现一个队列,那么我们就应该利用栈的特性"先进后出"让栈stack的栈顶变为队尾,让栈stack2的栈顶变为队头,我们可以想象将栈stack倒过来,然后将栈stack和栈stack2连接,这样我们就有了队头和队尾。

用两个栈实现队列_力扣_第1张图片

  • 那么我们怎么进行具体的入队和出队呢?我们入队的时候永远就将元素对stack入栈,出栈的时候判断stack2是否为空,如果为空就将stack的全部元素出栈然后对stack2入栈,正所谓"负负得正",经过两次翻转就利用两次"先进后出"形成了"先进先出"。

3. 代码实现

  • 那么话不多说,上代码环节~
class CQueue {
    Stack<Integer> stack = null;
    Stack<Integer> stack2 = null;
    public CQueue() {
        stack = new Stack<>();
        stack2 = new Stack<>();
    }

    public void appendTail(int value) {
        stack.push(value);
    }

    public int deleteHead() {
        if (stack2.isEmpty() && stack.isEmpty()) {
            return -1;
        } else if (stack2.isEmpty() && !stack.isEmpty()) {
            while (!stack.isEmpty()) {
                stack2.push(stack.pop());
            }
        }
        return stack2.pop();
    }
}
  • 又是一份快乐的题解~
  • 加油,内卷人~

你可能感兴趣的:(栈,剑指offer,数据结构,栈,队列,数据结构,stack,leetcode)