栈与队列
-
栈:先入后出,First In First Out (FIFO) ,类似桶(入到桶底、取从桶顶)
-
队列:先入先出,First In Last Out (FILO)
用两个栈实现一个队列
两个桶(栈),一个用来放苹果(入栈),一个用来取苹果(出栈)。苹果必须先入的先出来,而你只能从桶的顶端拿苹果。
- 1、入队操作(放苹果):每当你得到一个苹果,你就将它放入“入桶”底部
- 2、出队操作(取苹果):当你需要一个苹果,你先看“出桶”
- 如果“出桶”已经有苹果,你可以直接从顶部取一个
- 如果“出桶”是空的,你需要把所有“入桶”中的苹果(保持原有顺序的关键)倒进“出桶”,然后再取顶部的苹果。
用栈的概念来说,就是:
有两个栈,stack_in和stack_out
入队(enqueue):将元素压入 stack_in
出队(dequeue):
如果 stack_out为空,将 stack_in的所有元素弹出压入 stack_out
然后,从stack_out弹出第一个元素(这个元素相当于队列的头部元素)并返回这个元素。
这样的方法,保证了“先入先出”的队列特性,即使是使用后入先出的栈也一样。当stack_in用来接收新入队的元素时,stack_out用来管理出队操作。只有在stack_out为空的时候,你才需要把所有 stack_in 的元素转移到 stack_out,维持了队列先进先出的逻辑。