1.题目
2.思路
插入和删除次数都是10000,意思就是要保证用栈模拟队列也要保证插入O(1), 删除O (1).
题目都说了用两个栈,显然一个栈用于插入队列的数据,另一个栈用于实现删除队列头部元素。
队列:先进先出
栈:先进后出 ,再加一个栈,就可以负负得正。
需要考虑清楚的是,当一开始有append,中间有delete之后,再来append怎么处理。
stack1:只需要记录插入元素的值就行。
stack2: 每次要删除的时候,首先看stack2是不是为空
- stack2为空,需要考虑stack1是否为空
- 如果stack1为空,说明已经没有元素可以弹出,返回-1
- 如果stack2不为空,说明后面还有元素加入了,再把stack1的所有元素加入stack2,再弹出stack2栈顶即可。(如果要查看栈顶不弹出,使用stack2.peek())
- stack2不为空,说明之前都还有元素没有弹出,直接pop()
class CQueue {
public CQueue() {
}
Stack<Integer>stack1 = new Stack();
Stack<Integer>stack2 = new Stack();
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack2.isEmpty()){
if(stack1.isEmpty()) return -1;
else{
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
else{
return stack2.pop();
}
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
3.结果