最近由于工作原因,需要自己實現一個類似隊列的數據結構,所以想寫篇文章記錄并總結下隊列的相關內容,主要有以下4點:
- 1)隊列的定義
- 2)隊列的舉例
- 3)隊列的基本操作
- 4)隊列的實現(go)
1)隊列的定義
隊列,又稱為佇列(queue),是先進先出(FIFO, First-In-First-Out)的線性表。在具體應用中通常用鏈表或者數組來實現。隊列只允許在后端(稱為堆尾(rear))進行插入操作,即enqueue,在前端(稱為隊頭(front))進行刪除操作,即dequeue。隊列的操作方式和棧類似,唯一的區別在于隊列只允許新數據在后端進行添加。
2)隊列的舉例
隊列在生活中隨處可見,例如在車站排隊買票,排在最前面的人優先購票,排在最后面的人最后購票,不讓其他人插隊,符合先進先出的原則。再比如打印機的打印任務也是一個隊列,先發送到打印機的任務被優先打印,最后發送的打印任務最后打印。當然,上面舉的2個例子不是很嚴謹,因為難免會有人在排隊過程中由于某些原因退出排隊,或者發送給打印機的打印任務被刪除。
這里插個曲,我們去餐廳吃飯時,如果發現餐廳的餐具擺放是隊列方式實現的,即清洗干凈的餐具都從最底下加入,每次取干凈的餐具都從最上面取,那么可以斷定這家餐廳還是很講衛生的。如果發現餐廳的餐具擺放是棧的方式實現的,那么你得小心了,很可能你這次取的“干凈的餐具”已經放了幾個星期了。
提示:棧是先進后出
3)隊列的基本操作
隊列的基本操作主要有以下4種:
- Enqueue():往隊列中添加一個元素
- Dequeue():從隊列中刪除一個元素
- Peek():返回隊列中的第一個元素,但是不刪除
- IsEmpty():檢測隊列是否為空
4)隊列的實現(go)
隊列的實現一般常用鏈表或者數組實現,這里使用go的切片實現了一個隊列,并提供了相應的API,go的切片類似一個動態數組,會自動擴展容量大小,使用起來很方便。
隊列的實現代碼如下:
package main
import "fmt"
type Queue struct {
elements []interface{}
capacity int
size int
}
func NewQueue(capacity int) *Queue {
q := new(Queue)
q.elements = make([]interface{}, 0, capacity)
q.capacity = capacity
q.size = 0
return q
}
func (q *Queue) Enqueue(elements interface{}) {
q.elements = append(q.elements, elements)
q.size++
}
func (q *Queue) Dequeue() interface{} {
if !q.IsEmpty() {
front := q.elements[0]
q.elements = q.elements[1:]
q.size--
return front
}
return nil
}
func (q *Queue) Peek() interface{} {
if !q.IsEmpty() {
return q.elements[0]
}
return nil
}
func (q *Queue) IsEmpty() bool {
return q.size == 0
}
func main() {
q := NewQueue(10)
fmt.Println(q.IsEmpty())
for i := 0; i < 10; i++ {
q.Enqueue(i)
}
fmt.Println(q.elements)
fmt.Println(q.IsEmpty())
fmt.Println(q.Peek())
for i := 0; i < 10; i++ {
fmt.Println(q.Dequeue())
}
fmt.Println(q.elements)
fmt.Println(q.IsEmpty())
fmt.Println(q.Peek())
}
運行程序輸出如下:
true
[0 1 2 3 4 5 6 7 8 9]
false
0
0
1
2
3
4
5
6
7
8
9
[]
true
<nil>
參考
維基百科:https://zh.wikipedia.org/wiki/%E9%98%9F%E5%88%97
本次薦書:好好說話

好好說話