剑指Offer09题目解析
解析思路
栈的特性是FILO(先进后出),想要用两个栈实现队列,那么A、B栈互为逆序,A栈负责入队,B栈负责出队。
- A栈负责入队,直接往后追加
- B栈负责出队,当B不为空时,直接pop()
否则,当A为空时(A、B均为空),则返回 -1
否则,A逆序存入B中,B.pop()即可。
代码实现
class CQueue{
LinkedList<Integer> A,B;
public CQueue(){
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void appendTail(int value){
A.addLast(value);
}
public int deleteHead(){
if(!B.isEmpty()) return B.removeLast();
if(A.isEmpty()) return -1;
while(!A.isEmpty()){
B.addLast(A.removeLast());
}
return B.removeLast();
}
}
本例中可以思考的点:
- linkedList可以当作栈来用
- linkedList基础方法回顾总结:
注意peek()和poll()的区别
- peek()会返回head元素,但不会删除,如果队列是空的就返回null;
- poll()会弹出head元素(等于删除并返回head元素),如果队列为空则返回null;
- element()会查看首个元素,但不会删除,这点和peek()很像,但是队列为空时则抛出异常NoSuchElementException