Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】

题目

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

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]


示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]


提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

解题思路

1.题目要求我们用两个栈实现队列,但是给出的示例看起来不太明白,那就让我们换成图片的形式来理解一下吧!

举个例子:假设我们所要进行的操作如下

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第1张图片

 我们先新建两个栈 stack1 和 stack2,再建立一个queue(队列)帮助理解

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第2张图片

接下来我们开始执行操作

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第3张图片 入栈的元素我们都先放入 Stack1 中,同时也给队列入队来做对比。

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第4张图片

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第5张图片 此时下一步是出队,如果我们直接从Stack1出,那就不满足我们队列先进先出的性质,所以这个时候我们就要用到我们的 Stack2,在执行出队操作时,我们要先判断 Stack2 是否有元素,若有则直接从 Stack2 出栈,若没有我们就需要将 Stack1 中的所有元素出栈再将元素入栈到 Stack2 中。

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第6张图片

 这时我们可以看到 Stack2 出栈的顺序就与队列一致了,我们就可以将最先入队的 1 让它出队

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第7张图片

下一操作还是入队,我们依旧要将入队的元素先放入 Stack1 中,

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第8张图片 然后开始出队,Stack2 中有元素就让 Stack2 出栈,若 Stack2 为空 就将 Stack1 中的元素入栈到 Stack2 中,直到 两个栈都为空,则说明队列中所有元素已经出队了。

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第9张图片

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第10张图片Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第11张图片

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第12张图片

 2.代码的实现,我们需要先设置两个栈,然后将两个栈进行初始化,在appendTail()入队操作时,我们只需将元素入栈到Stack1即可,在deleteHead()出队操作时,我们需要先判断 Stack2 是否为空,若不为空则直接从 Stack2 出栈,若为空我们就需要将 Stack1 中的所有元素出栈再将元素入栈到 Stack2 中。然后从Stack2出栈即可。当两个栈都为空时,就代表队列已经为空,返回 -1。

 

代码实现

class CQueue {
    Stack stack1;
    Stack stack2;
    public CQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void appendTail(int value) {
        stack1.push(value);
    }
    
    public int deleteHead() {
        if(!stack2.isEmpty()){
            return stack2.pop();
        }
        if(!stack1.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
            return stack2.pop();
    }
    return -1;
}
}

测试结果

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第13张图片

Leetcode-每日一题【剑指 Offer 09. 用两个栈实现队列】_第14张图片 

 

你可能感兴趣的:(算法每日一题,leetcode,算法,职场和发展,数据结构,java)