解题思路:栈
使用两个栈实现先入先出的队列
其中一个栈作为压入栈:data 我们只向这个栈压入数据
另一个栈作为弹出栈:help,这个栈只负责弹出数据
栈作为一种 LIFO 的数据结构,要想实现队列的入队和出队操作,需要定义一个方法,这个方法负责将 data 中的数据全部都“倒入” help 中;
该方法命名为 dataToHelp ,我们需要保证两点:
- 倒入的前提是 help 中不能有数据
- 需要将 data 中的所有数据都一次性倒完
该方法如下:
private void dataToHelp(){while(!data.isEmpty()){help.push(data.pop());}}
该方法执行的时机理论上没有要求,只要满足上述两点即可。
代码
class CQueue {private Stack<Integer> data;private Stack<Integer> help;public CQueue() {data = new Stack<>();help = new Stack<>();}public void appendTail(int value) {data.push(value);}public int deleteHead() {if(data.isEmpty() && help.isEmpty()){return -1;}if(help.isEmpty()){dataToHelp();}return help.pop();}private void dataToHelp(){while(!data.isEmpty()){help.push(data.pop());}}}/*** Your CQueue object will be instantiated and called as such:* CQueue obj = new CQueue();* obj.appendTail(value);* int param_2 = obj.deleteHead();*/
复杂度分析
- 时间复杂度:
- appendTail :在末尾添加元素的时间复杂度为 O(1)
- deleteHead :删除头节点的时间复杂度是一个均摊复杂度计算问题,我们在这里讨论的是向队列添加了 N 个元素并删除了这 N 个元素的复杂度;如果是上面说的情况,那么 deleteHead 中涉及到了 dataToHelp 操作,该算法的复杂度为 O(N),所以 deleteHead 的时间复杂度也为 O(N)
- 空间复杂度:O(N)
- 栈 data 与 help 共保存 N 个元素
_
