日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

数据结构--队列(数组)的一种实现

發布時間:2025/3/21 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构--队列(数组)的一种实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單向隊列(數組實現)

package mainimport ("errors""fmt""os" )//隊列是一種重要的數據結構,應用也相對廣泛,實現隊列的方式主要有數組和鏈表兩種方式 //下面首先使用數組實現一個簡單的單向隊列 //隊列的信息包括隊列的大小、隊列的存儲形式(數組)、隊列的頭(不指向第一元素)、隊列的尾(指向最后一個元素) //對列的操作方法主要有向隊列添加一個元素、從隊列中獲取一個元素、顯示隊列中的元素 //定義一個結構體用于保存隊列的信息 type signalQueue struct {maxSize intarray [5]int //模擬隊列head inttail int }//定義一個向隊列添加元素的方法 func (q *signalQueue) Push(val int) error{//先判斷隊列是否已滿if q.tail == q.maxSize - 1 { //tail含最后一個元素return errors.New("隊列已滿")}q.tail++ //向后移動尾部q.array[q.tail] = valreturn nil }//定義一個從隊列獲取元素的方法 func (q *signalQueue) Pop() (val int, err error) {//判斷隊列是否為空if q.tail == q.head {return -1, errors.New("隊列為空")}q.head++ //由于head指向第一個元素的前面,因此要先向后移動val = q.array[q.head]return val, nil }//定義一個顯示隊列元素的方法 func (q *signalQueue) List() error {//找到隊首(不含第一個元素),然后遍歷到隊尾for i := q.head + 1; i <= q.tail; i++{fmt.Printf("array[%d]=%d\t", i, q.array[i])}fmt.Println()return nil }func main (){queue := &signalQueue{maxSize: 5,array: [5]int{},head: -1,tail: -1,}var key stringvar 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.Push(val)if err != nil {fmt.Println(err)} else {fmt.Println("成功入隊")}case "get":val, err := queue.Pop()if err != nil {fmt.Println(err)} else {fmt.Println("出隊列的數為:", val)}case "show":queue.List()case "exit":os.Exit(0)}} }//總結: //上面實現的單向隊列存在的一個最大的問題是: //沒有有效的利用數據的有效空間,會存在添加數據顯示隊列已滿,但是獲取數據又顯示隊列為空的情況 //解決的辦法就是將數組的尾部和頭部連接到一起實現一個環形隊列即可解決上面的問題

環形隊列(數組實現)

package mainimport ("errors""fmt""os" )//環形隊列實現時head指向隊首第一個元素,tail指向隊尾元素的下一個位置,(空一個位置作為保留) //定義一個結構體管理環形隊列 type circelQueue struct {maxSize intarray [5]inthead inttail int }//定義一個入隊列方法 func (q *circelQueue) Push(val int) error {//判斷是否已滿if q.IsFull(){return errors.New("隊列已滿")}q.array[q.tail] = valq.tail = (q.tail + 1) % q.maxSize //tail指向尾部的后一個位置return nil }//定義一個出隊列方法 func (q *circelQueue) Pop() (val int, err error) {//判斷隊列是否為空if q.IsEmpty(){return -1, errors.New("隊列為空")}val = q.array[q.head]q.head = (q.head + 1) % q.maxSize //head指向下一個元素(下一個隊首)return val, nil }//定義一個方法判斷環形隊列是否已滿 func (q *circelQueue) IsFull () bool {return (q.tail + 1) % q.maxSize == q.head }//定義一個方法判斷環形隊列是否為空 func (q *circelQueue) IsEmpty() bool {return q.tail == q.head }//獲取環形隊列的元素個數 func (q *circelQueue) Size() int {return (q.tail + q.maxSize - q.head) % q.maxSize }//定義一個顯示環形隊列元素的方法 func (q *circelQueue) List(){//判斷隊列是否為空if q.Size() == 0 {fmt.Println("隊列為空")}//定義一個輔助變量指向head, 臨時headtempHead := q.headfor i := 0; i < q.Size(); i++ {fmt.Printf("arr[%d]=%d\t", tempHead, q.array[tempHead])tempHead = (tempHead + 1) % q.maxSize}fmt.Println() }func main(){queue := &circelQueue{maxSize: 5,array: [5]int{},head: 0,tail: 0,}var key stringvar 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.Push(val)if err != nil {fmt.Println(err)} else {fmt.Println("成功入隊")}case "get":val, err := queue.Pop()if err != nil {fmt.Println(err)} else {fmt.Println("出隊列的數為:", val)}case "show":queue.List()case "exit":os.Exit(0)}} } //總結: //環形隊列可以解決單向隊列沒有有效的利用數組有效空間的問題 //環形隊列的實現也符合大部分應用場景

總結

以上是生活随笔為你收集整理的数据结构--队列(数组)的一种实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。