剑指Offer09用两个栈实现队列
1. 问题描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
2. 代码实现
2.1 方法一
使用LinkedList数据结构:
void
push(E e)
将元素推送到由此列表表示的堆栈上E
pop()
从此列表表示的堆栈中弹出一个元素。
- 两种方法关键逻辑大致相同,但也有一些细节上的差异。
class CQueue {
Deque<Integer> stack1;
Deque<Integer> stack2;
public CQueue() {
stack1 = new LinkedList<Integer>();
stack2 = new LinkedList<Integer>();
}
/**
*添加数据
*/
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
// 栈2为空,把栈1数据放到栈2中
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
// 如果stack2为空,将stack1中的数据取出放到stack2中
stack2.push(stack1.pop());
}
}
// 执行删除的逻辑
if(stack2.isEmpty()){
return -1;
}else{
int result = stack2.pop();
return result;
}
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
2.2 方法二
使用Stack数据结构:
E
pop()
删除此堆栈顶部的对象,并将该对象作为此函数的值返回。E
push(E item)
将项目推送到此堆栈的顶部。
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
/**
* 初始化两个栈
*/
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
/**
* @param value
*/
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
// 如果栈2不为空,直接取出数据
if (!stack2.isEmpty()){
return stack2.pop();
}else {
// 栈2为空,把栈1数据同步到栈2
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
// 然后再判断栈2是否为空
return stack2.isEmpty() ? -1:stack2.pop();
}
}
}
3. 测试结果
方法一:
- 执行用时:56 ms, 在所有 Java 提交中击败了70.44%的用户
- 内存消耗:48.7 MB, 在所有 Java 提交中击败了18.69%的用户
方法二:
- 执行用时:56 ms, 在所有 Java 提交中击败了70.44%的用户
- 内存消耗:47.7 MB, 在所有 Java 提交中击败了70.21%的用户