1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/88b64e0a9fe841ec8e828cdc3eed9c03.png)
- 题目输入输出的意思:
- 输入 CQueue,appendTail,deleteHead,deleteHead。[ [], [3], [], [] ]
- 表示,先实例化CQueue类,然后进行appendTail(3),然后deleteHead(),再deleteHead() 。注意:数组中的3就是操作数!
- 然后输出结果是:
- null( 创建对象无返回值 )
- null(appendTail()无返回值 )
- 3( 此时A栈只有一个元素3,B栈空,那么此时deleteHead()返回值就是3 )
- -1( AB都空,返回-1 )
2. 思路
- 此题的意思是实现一个队列类,有2个方法,appendTail():队列尾部插入整数。deleteHead():队列头部删除整数。但是函数内部代码需要用2个栈实现。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d6d4a1725d46489fa994d96798036805.jpg)
如图所示
我们使用
stackA 来实现 appendTail()
stackB 来实现 deleteHead()
appendTail():直接push入A栈
deleteHead():
如果B栈有元素,弹出B栈栈顶元素
如果B栈没有元素:
如果A栈没有元素,此时AB都无元素,表示队列为空,return -1;
如果A栈有元素,把A栈 所有 元素弹出然后入B栈,然后返回B栈顶元素即可。
-----------------------------------------------------------------------------------------------
注意点:
1. deleteHead删除时,如果B栈没有元素A有元素,必须把A中 --所有-- 元素先入B栈才行,不能只入部分。
因为这样如果再appendTail(),那么队列的顺序就改变了,可以自己模拟一下。
3. 代码
import java.util.Stack;
class CQueue {
Stack<Integer> stackA, stackB;
public CQueue() {
stackA = new Stack<Integer>();
stackB = new Stack<Integer>();
}
public void appendTail(int value) {
stackA.push(value);
}
public int deleteHead() {
if(!stackB.empty()){
return stackB.pop();
}
else{
if(stackA.empty()){
return -1;
}
else{
while(!stackA.empty()){
stackB.push(stackA.pop());
}
return stackB.pop();
}
}
}
}