只有用水將心上的霧氣淘洗乾淨,榮光纔會照亮最初的夢想。
——加西亞·馬爾克斯
上代碼
package main
import (
"fmt"
"os"
)
type Queue struct {
List []int
}
// 創建一個新隊列
func newQueue(len int) *Queue {
// 這裏加了個判斷,創建時可以傳入隊列長度,滿了就不能添加。你也可以不用傳參,直接list := make([]int, 0),然後不用判斷滿沒滿即可
if len == 0 {
fmt.Println("queue don't allow empty.")
os.Exit(0)
}
list := make([]int, 0, len)
return &Queue{List: list}
}
// 入隊一個數據
func (q *Queue) inQ(data int) {
if len(q.List)+1 > cap(q.List) {
fmt.Print("隊列已滿,數值:", data, "無法入隊! len=", len(q.List), "\t,cap=", cap(q.List), "\t當前隊列數據:")
q.printQ()
os.Exit(0)
}
q.List = append(q.List, data)
}
// 出隊一個數據
func (q *Queue) popQ() int {
if len(q.List) == 0 {
fmt.Println("queue is empty.")
os.Exit(0)
}
data := q.List[0]
q.List = append(q.List[1:])
return data
}
// 遍歷隊列的每個值
func (q *Queue) printQ() {
for _, value := range q.List {
fmt.Print(value, "\t")
}
}
func main() {
q := newQueue(5)
fmt.Println("創建的新隊列:", *q, "容量:", cap(q.List), " 長度:", len(q.List))
q.inQ(6)
q.inQ(7)
q.inQ(8)
q.inQ(9)
fmt.Println("入隊新值,打印隊列數據:")
q.printQ()
fmt.Println("當前隊列:", *q, " ,容量:", cap(q.List), " ,長度:", len(q.List))
data := q.popQ()
fmt.Println("彈出一個值:", data)
fmt.Println("當前隊列:")
q.printQ()
data1 := q.popQ()
fmt.Println("\n彈出一個值:", data1)
data2 := q.popQ()
fmt.Println("彈出一個值:", data2)
data3 := q.popQ()
fmt.Println("彈出一個值:", data3)
fmt.Println("當前隊列:", *q)
// 創建長度爲3的隊列,但是入隊時準備了四個數據
q2 := newQueue(3)
fmt.Println("創建的新隊列:", *q2, "容量:", cap(q2.List), " 長度:", len(q2.List))
q2.inQ(6)
q2.inQ(7)
q2.inQ(8)
fmt.Println("當前隊列:", q2.List)
q2.inQ(9) // 將無法入隊
}
控制檯:
創建的新隊列: {[]} 容量: 5 長度: 0
入隊新值,打印隊列數據:
6 7 8 9 當前隊列: {[6 7 8 9]} ,容量: 5 ,長度: 4
彈出一個值: 6
當前隊列:
7 8 9
彈出一個值: 7
彈出一個值: 8
彈出一個值: 9
當前隊列: {[]}
創建的新隊列: {[]} 容量: 3 長度: 0
當前隊列: [6 7 8]
隊列已滿,數值:9無法入隊! len=3 ,cap=3 當前隊列數據:6 7 8
Process finished with exit code 0