如同 Stack 一样,Queue 也是一种线性的数据结构。不同点在于 Stack 是后进先出 (Last In First Out),而 Queue 是先进先出 (First In First Out) FIFO
每次添加 (enqueue) 元素添加在队尾 (back), 每次取出 (dequeue) 元素取出对头 (front)
可以将生活中的排队抽象为 Queue 这种数据结构
enqueue 和 dequeue 操作思路如下
为使一个元素 x enqueue,我们让 currentSize 和 back 增加1,使 currentSize[size] = x
为使元素 dequeue,我们置返回值为 theArray[front], 且 currentSize - 1,然后使 front 加1
Implementing Queue using Array
使用 Array 来实现 Queue 时,要注意的一点是,当 front 为 array.length - 1 时,即 front 指向最后一个元素时,再想要 enqueue 就无法完成了。为解决该问题,我们用到了循环数组实现 (circular array),即 只要 front 或 back 到达数组的尾端,它就又绕回到开头
Java 实现如下
所有操作的时间复杂度为 O(1)
Implementing Queue using LinkedList
enqueue 即在 LinkedList 后增加一个 node
dequeue 即 remove head node,move front to next node
Implementing Queue using Stack
使用两个 stack 来实现 Queuepush()
把元素添加到最底端pop()
把最顶端的元素取出peek()
返回最顶端的元素isEmpty()
看 Queue 是否为空
除了 push()
在 Stack 和 Queue 中表示不同的含义以外,其余的方法都是一样的push()
在 Stack 中是把元素添加到最顶端,而在 Queue 中,秉承着 FIFO 的原则,push()
表示把元素添加到最底端
如何实现呢,这里提供一种思路
使用两个 stack,当需要把元素添加到 stack1 中时,先把 stack1 中的现有元素转移到 stack2 中
再 push()
,然后把 stack2 中元素再转移到 stack1 中
Java 代码实现如下
关于 Queue,有个有趣的应用 ———> 在这里
即给定一个数 n,返回从 1 到 n 的所有二进制数
GeeksforGeeks 上提供的算法是这样的
1) Create an empty queue of strings
2) Enqueue the first binary number “1” to queue.
3) Now run a loop for generating and printing n binary numbers.
……a) Dequeue and Print the front of queue.
……b) Append “0” at the end of front item and enqueue it.
……c) Append “1” at the end of front item and enqueue it.
Source: http://www.geeksforgeeks.org/interesting-method-generate-binary-numbers-1-n/
Java 实现如下:
运行结果如下:
1
10
11
100
101
110
111
Queue 由于其 FIFO 的特点,在我们不知道 input size 而又要将 input 存入到 array 中去时,queue 就可以派上用场了
先将元素 enqueue 到 queue 中,再求 q.size(),再将元素 dequeue 到 array 中
关于 Queue 的讨论就到这里
以上内容如有疏漏或不足之处,欢迎与我讨论
邮箱:entropy714@gmail.com
微信:cobain0714