剑指 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 次调用
上大二时候就学的老经典了。
思路:声明两个栈s1
,s2
。入队列操作等同于入栈s1
。出队列操作分三种情况:1.两个栈都为空,意味着队列为空,返回 -1。2.s2
为空,而s1
不为空,此时应该把s1
中的元素出栈,并按出栈顺序入s2
。3.s2
不为空,执行出栈操作,等同于出队列。寻思寻思,是不是这么个事。
代码:
class CQueue {
LinkedList<Integer> s1;
LinkedList<Integer> s2;
public CQueue() {
s1 = new LinkedList<>();
s2 = new LinkedList<>();
}
public void appendTail(int value) {
s1.add(value);
}
public int deleteHead() {
if(s1.isEmpty() && s2.isEmpty())
return -1;
else if(s2.isEmpty() && !s1.isEmpty()){
while(!s1.isEmpty()){
s2.add(s1.poll());
}
return s2.poll();
}
else
return s2.poll();
}
}
这里用的LinkdeList,底层实现是个双向链表,增删比较省时间。用啥都一样,无所谓。就是别直接用queue偷鸡就行hhhh