剑指Offer09 - 用两个栈实现队列
题目描述
用两个栈实现一个队列。队列的生命如下,请实现它的两个函数
appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回-1)。
1 | /** |

思路
使用两个栈实现队列,考察的是栈和队列的工作方式。栈是后进先出,队列是先进先出。假设有栈s1和栈s2,分析如下:
- 入队列:直接入栈s1
- 出队列:
- 如果栈s2为空,栈s1不为空,由于出栈是从栈顶弹出元素,而出队列是从队列首弹出元素,因此不能直接从栈s1出栈,需要借助栈s2。可以将s1中的元素逐个弹出并压入s2中,此时,最后入栈s1的就在栈s1的栈底,而最先入栈s1的元素在栈s2的栈顶。因此只要再从s2出栈,即可拿到最先入队列的元素。
- 如果栈s2为空,栈s1也为空,则队列中没有任何元素,返回-1。
- 如果栈s2不为空,可直接从s2出栈,得到的就是当前队列的队首元素。
代码实现
1 | class CQueue { |