golang環形隊列實現

Summary

  1. 什麼是環形隊列
  2. 實現環形隊列圖示過程
  3. golang版本代碼實現過程
  4. 參考所有代碼

什麼是環形隊列

在一個指定大小的數組裏循環寫入數據,借用二個指針分別實現入隊標記與出隊標記.也體現了指針的大好用處,請深刻體會.大有裨益.git

如圖所示,一個環形隊列.含有二個指針: 隊列頭指針,隊列尾指針.

image.png

實現環形隊列圖示過程

  1. 初始化一個數組大小爲6的環形隊列, 頭指針front=0, 尾指針rear=0, 恰好front=rear =0的狀態,表示環形隊列爲空.

image.png
2.向環形隊列裏插入1個元素,則rear指針移動一格,front=0,rear=1
image.png
3.繼續添加a2,a3,a4,a5元素,rear指針指到末尾處,front=0, reat=5
image.png
4.若是再繼續添加a6元素,則rear=6,大於數組大小,發生數組溢出.
image.png
5.如上圖所示添加a6時,rear指針發生溢出.咱們使用一個小技巧,當rear=6時與數組大小6進行取模, (rear+1) % maxLen,讓rear指針回到開始處rear=0,問題來了,我
們沒法判斷數組是否滿?由於初始化時front=rear=0, 如今數組滿也是front=rear=0
image.png
6.解決以上問題有三種辦法,咱們採用第3種方法實現.
image.pnggithub

使用第3種方法: 即當(rear+1) % maxLen == front時,判斷環形數組滿,則沒法添加元素

image.png

golang版代碼實現過程

a. 定義環形數據結構golang

type CycleQueue struct {
  data  []interface{} //存儲空間
  front int           //前指針,前指針負責彈出數據移動
  rear  int           //尾指針,後指針負責添加數據移動
  cap   int           //設置切片最大容量  
}

b.初始化環形隊列數組

func NewCycleQueue(cap int) *CycleQueue {
  return &CycleQueue{
    data:  make([]interface{}, cap),
    cap:   cap,
    front: 0,
    rear:  0,
  }
}

c. 入隊操做數據結構

//入隊操做
//判斷隊列是否隊滿,隊滿則不容許添加數據
func (q *CycleQueue) Push(data interface{}) bool {
  //check queue is full
  if (q.rear+1)%q.cap == q.front { //隊列已滿時,不執行入隊操做
    return false
  }
  q.data[q.rear] = data         //將元素放入隊列尾部
  q.rear = (q.rear + 1) % q.cap //尾部元素指向下一個空間位置,取模運算保證了索引不越界(餘數必定小於除數)
  return true
}

d.出隊操做spa

//出隊操做
//須要考慮: 隊隊爲空沒有數據返回了
func (q *CycleQueue) Pop() interface{} {
  if q.rear == q.front {
    return nil
  }
  data := q.data[q.front]
  q.data[q.front] = nil
  q.front = (q.front + 1) % q.cap
  return data
}

e:求當前的環形隊列長度3d

//由於是循環隊列, 後指針減去前指針 加上最大值, 而後與最大值 取餘
func (q *CycleQueue) QueueLength() int {
  return (q.rear - q.front + q.cap) % q.cap
}

參考所有代碼

github
image.png指針

相關文章
相關標籤/搜索