一、题目描述
用栈来模拟一个队列,要求实现队列的两个基本操作:入队和出队。
二、解题思路
栈:先入后出(栈底指向栈底元素,栈顶指向栈顶元素)
队列:先入先出(队头指向队首元素,队尾指向队尾元素的下一个位置)
解题过程:
1、如栈时,让元素一次压入栈A
2、出栈时,让元素依次从栈A中pop(),再压入栈B中,此时栈B中的元素顺序与原来栈A中的元素顺序刚好相反,然后直接从栈B中弹出元素即可。
3、这时如果再次执行入栈操作,则直接把元素压入栈A中即可。
4、如果还要再次出栈,则从栈B中弹出;直到栈B为空,再把元素从栈A中弹出,压入栈B。(注意:一定要等栈B再次为空,再执行把元素从栈A中弹出,压入栈B的操作。)
该方法的入队操作时间复杂度是O(1)
出队操作时间复杂度分两种:需要元素迁移的出队操作时间复杂度是O(n),不需要元素迁移的出队操作时间复杂度是O(1);在这种情况下,有一个概念叫做均摊时间复杂度。需要元素迁移的出队操作只是少数,并且不可能连续出现,大多数的元素出队都不需要迁移。所以,把时间均摊到每一次出队操作上面,时间复杂度为O(1)。
代码实现:
class