数据结构--队列(数组)的一种实现
生活随笔
收集整理的這篇文章主要介紹了
数据结构--队列(数组)的一种实现
小編覺得挺不錯的,現(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--稀疏矩阵的一种实现
- 下一篇: 密码技术应用--AES文件加解密