一、题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素deleteHead 操作返回 -1 );
提示:1 <= values <= 10000;最多会对 appendTail、deleteHead 进行 10000 次调用
二、思路
题意是:用两个栈来实现队列的入队和出队操作。appendTail()方法实现入队。deleteHead()方法实现出队操作;
1、入队操作:
1、将需要入队的元素压入栈1;
2、出队操作:
2、 先判断栈2有没有元素:
栈2有元素,先将栈2元素出栈;
栈2没无元素、判断栈1是否有元素:
栈1元素移动栈2,然后返回栈2栈顶;
3、 栈1、栈2都没元素:返回-1;
三、代码
class CQueue {
// 1、定义两个全局的栈
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
// 2、入队操作直接添加到栈1
public void appendTail(int value) {
stack1.push(value);
}
// 3、出队操作
public int deleteHead() {
//3.1 先判断栈2是否为空,栈2非空返回栈顶元素
if(!stack2.isEmpty()){
return stack2.pop();
}
// 3.2 若栈2为空,判断栈1是否为空,栈1非空,则将栈1元素转移到栈2
if(!stack1.isEmpty()){
while (!stack1.isEmpty()){
stack2.push(stack1.pop());
}
// 返回栈2栈顶
return stack2.pop();
}
// 3.3 栈1、栈2为空,返回-1
return -1;
}
}
四、总结
1、队列的特点是元素先进先出,新元素只能添加到队尾、删除操作只能在队头。
2、栈的特点是元素先入后出。栈操作元素都在栈顶。
3、要两个栈相互配合达到先入先出的效果就得判断元素出队时两个栈的元素的情况。