日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

單向隊列(數(shù)組實現(xiàn))

package mainimport ("errors""fmt""os" )//隊列是一種重要的數(shù)據(jù)結(jié)構(gòu),應(yīng)用也相對廣泛,實現(xiàn)隊列的方式主要有數(shù)組和鏈表兩種方式 //下面首先使用數(shù)組實現(xiàn)一個簡單的單向隊列 //隊列的信息包括隊列的大小、隊列的存儲形式(數(shù)組)、隊列的頭(不指向第一元素)、隊列的尾(指向最后一個元素) //對列的操作方法主要有向隊列添加一個元素、從隊列中獲取一個元素、顯示隊列中的元素 //定義一個結(jié)構(gòu)體用于保存隊列的信息 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//添加數(shù)據(jù)for {fmt.Println("1.add添加數(shù)據(jù)到隊列")fmt.Println("2.get從隊列獲取數(shù)據(jù)")fmt.Println("3.show顯示隊列")fmt.Println("4.exit退出隊列")fmt.Scanln(&key)switch key {case "add":fmt.Println("輸入你要入隊列的數(shù)據(jù)")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("出隊列的數(shù)為:", val)}case "show":queue.List()case "exit":os.Exit(0)}} }//總結(jié): //上面實現(xiàn)的單向隊列存在的一個最大的問題是: //沒有有效的利用數(shù)據(jù)的有效空間,會存在添加數(shù)據(jù)顯示隊列已滿,但是獲取數(shù)據(jù)又顯示隊列為空的情況 //解決的辦法就是將數(shù)組的尾部和頭部連接到一起實現(xiàn)一個環(huán)形隊列即可解決上面的問題

環(huán)形隊列(數(shù)組實現(xiàn))

package mainimport ("errors""fmt""os" )//環(huán)形隊列實現(xiàn)時head指向隊首第一個元素,tail指向隊尾元素的下一個位置,(空一個位置作為保留) //定義一個結(jié)構(gòu)體管理環(huán)形隊列 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 }//定義一個方法判斷環(huán)形隊列是否已滿 func (q *circelQueue) IsFull () bool {return (q.tail + 1) % q.maxSize == q.head }//定義一個方法判斷環(huán)形隊列是否為空 func (q *circelQueue) IsEmpty() bool {return q.tail == q.head }//獲取環(huán)形隊列的元素個數(shù) func (q *circelQueue) Size() int {return (q.tail + q.maxSize - q.head) % q.maxSize }//定義一個顯示環(huán)形隊列元素的方法 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//添加數(shù)據(jù)for {fmt.Println("1.add添加數(shù)據(jù)到隊列")fmt.Println("2.get從隊列獲取數(shù)據(jù)")fmt.Println("3.show顯示隊列")fmt.Println("4.exit退出隊列")fmt.Scanln(&key)switch key {case "add":fmt.Println("輸入你要入隊列的數(shù)據(jù)")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("出隊列的數(shù)為:", val)}case "show":queue.List()case "exit":os.Exit(0)}} } //總結(jié): //環(huán)形隊列可以解決單向隊列沒有有效的利用數(shù)組有效空間的問題 //環(huán)形隊列的實現(xiàn)也符合大部分應(yīng)用場景

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。