剑指offer刷题记录-Java篇
剑指 Offer 09. 用两个栈实现队列
题目内容:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )。
示例 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]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
题目内容分析:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
这一行表示每一行代码的操作
[[],[3],[],[]]
这个表示每一行代码操作所需要的参数
解释说明:
CQueue 表示新建一个CQueue对象,对应的所需参数为[],即此操作不需要参数。
appendTail 表示执行一个appendTail()操作,对应要被操作的元素为3。
deleteHead 表示执行一个deleteHead操作,对应的所需参数为[],即此操作不需要参数。
deleteHead 表示执行一个deleteHead操作,对应的所需参数为[],即此操作不需要参数。
以上的输入其实是一个代码执行的步骤描述与其对应所需参数。
即两个纬度:
1、操作描述
2、此次操作所需参数
3、操作描述与操作所需参数是通过默认顺序一一对应的。
解题思路:
- 首先创建两个栈
s1用于入栈,s2用于出栈 - 入队列的元素直接进入s1
首先入栈的元素会处于s1的栈底 - 此时如果进行出队列操作
- 首先将s1的元素全部转移至s2
- 这时候s2的栈顶即为最先入队列的head元素
- 在s2栈空之前栈顶的元素始终为队列头
- 如果在这之间有元素入队列,则全部暂存在s1
- 若s2栈空
- 首先查看s1中是否含有元素
- 如果有则将s1中的元素再次全部转移至s2,此时s2的栈顶仍为队列头
- 如果s1、s2均为空,则返回-1
代码:
class CQueue {
Stack<Integer> s1;
Stack<Integer> s2;
public CQueue() {
s1=new Stack<>();
s2=new Stack<>();
}
public void appendTail(int value) {
//直接在s1添加
s1.push(value);
}
public int deleteHead() {
//首先查看s2是否为空
if(s2.isEmpty()){
//s2为空,查看s1是否为空
if(s1.isEmpty()){
return -1;
}
else{
//将s1的所有值放入s2
while(!(s1.isEmpty())){
s2.push(s1.pop());
}
return s2.pop();
}
}
else{
return s2.pop();
}
}
}