1. 程式人生 > 其它 >go 陣列實現單向佇列

go 陣列實現單向佇列

本佇列有問題, 單向的,需要優化尾環形佇列

package main

import (
	"errors"
	"fmt"
	"os"
)

type Queue struct {
	maxSize int
	arr     [4]int // 陣列模擬佇列
	front   int    // 指向佇列的最前面 隊首
	rear    int    // 指向隊尾
}

func main() {
	queue := &Queue{
		maxSize: 4,
		arr:     [4]int{},
		front:   -1,
		rear:    -1,
	}

	var key string
	var val int
	for {
		fmt.Println("1  add 新增資料到佇列")
		fmt.Println("2  get 從佇列獲取資料")
		fmt.Println("3  show 顯示佇列")
		fmt.Println("4  exit 退出佇列")

		fmt.Scanln(&key)

		switch key {
		case "add":
			fmt.Println("請輸入一個數")
			fmt.Scanln(&val)
			err := queue.addQueue(val)
			if err != nil {
				fmt.Println("新增錯誤", err)
			} else {
				fmt.Println("新增成功")
			}
		case "get":
			val, err := queue.get()
			if err != nil {
				fmt.Println(err.Error())
			}
			fmt.Printf("取出一個數 %d\n", val)

		case "show":
			queue.show()

		case "exit":
			os.Exit(0)
		}

	}
}

// 新增資料到佇列
func (q *Queue) addQueue(value int) (err error) {
	// 判斷佇列是否已滿
	if q.ifFull() {
		return errors.New("佇列已滿")
	}

	q.rear++ // rear後移
	q.arr[q.rear] = value

	return nil
}

// 從佇列中取出資料
func (q *Queue) get() (int, error) {
	// 判斷佇列是否為空
	if q.isEmpty() {
		fmt.Println("佇列為空")
	}

	q.front++
	val := q.arr[q.front]
	return val, nil
}

func (q *Queue) ifFull() bool {
	return q.rear == q.maxSize-1 // rear 是佇列尾部 含佇列尾部
}

func (q *Queue) isEmpty() bool {
	return q.rear == q.front
}

// 顯示佇列
func (q *Queue) show() {
	// 找到隊首 遍歷到隊尾
	fmt.Println("\n隊列當前的情況是:")
	for i := q.front + 1; i <= q.rear; i++ {
		fmt.Printf("array[%d]=%d\n", i, q.arr[i])
	}
}

  

新增成功
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
add
請輸入一個數
3
新增成功
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
show

隊列當前的情況是:
array[0]=1
array[1]=2
array[2]=3
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
get
取出一個數 1
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
show

隊列當前的情況是:
array[1]=2
array[2]=3
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
get
取出一個數 2
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
show

隊列當前的情況是:
array[2]=3
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
add
請輸入一個數
4
新增成功
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
show

隊列當前的情況是:
array[2]=3
array[3]=4
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
get
取出一個數 3
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
get
取出一個數 4
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
show

隊列當前的情況是:
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列
add
請輸入一個數
4
新增錯誤 佇列已滿
1 add 新增資料到佇列
2 get 從佇列獲取資料
3 show 顯示佇列
4 exit 退出佇列