LeetCode 迴圈佇列

twisted-fate發表於2019-05-18

迴圈佇列

覆盤:

isFull 的地方遺漏了取餘操作 , rear 的邊界處理沒想到

畫圖的時候沒走完整可能性 , 下次畫的時候可以每走一步,根據圖和虛擬碼執行一次所有函式

定義

data 存放資料的有限長度陣列
head 指向佇列頭的第一個元素, 初始化0
tail 指向佇列尾的最後一個元素 初始化 0
cap 容量 = len(data) -1
dataLen  陣列長度

畫圖

入隊

data[tail] = number
tail = tail++  % dataLen
return 

LeetCode 迴圈佇列

LeetCode 迴圈佇列


出隊

if this.isEmpty() throw Exception

res=data[head]
head=head+1 % dataLen
return res

LeetCode 迴圈佇列

tail 迴圈

LeetCode 迴圈佇列

佇列滿狀態

if (tail+1)%dataLen==head

LeetCode 迴圈佇列

佇列空狀態

if head==tail

LeetCode 迴圈佇列


LeetCode 迴圈佇列

Accepted:

type MyCircularQueue struct {
    data []int
    head int
    tail int
    cap  int
    len  int
}

/** Initialize your data structure here. Set the size of the queue to be k. */
func Constructor(k int) MyCircularQueue {
    q := MyCircularQueue{data: make([]int, k+1), head: 0, tail: 0, cap: k, len: k+1}
    return q
}

/** Insert an element into the circular queue. Return true if the operation is successful. */
func (this *MyCircularQueue) EnQueue(value int) bool {
    if this.IsFull() {
        return false
    }
    this.data[this.tail] = value
    this.tail=(this.tail+1) % this.len
    return true
}

/** Delete an element from the circular queue. Return true if the operation is successful. */
func (this *MyCircularQueue) DeQueue() bool {
    if this.IsEmpty() {
        return false
    }
    //res:=this.data[head]
    this.head=(this.head+1) % this.len
    return true
}

/** Get the front item from the queue. */
func (this *MyCircularQueue) Front() int {
    if this.IsEmpty() {
        return -1
    }
    return this.data[this.head]
}

/** Get the last item from the queue. */
func (this *MyCircularQueue) Rear() int {
    if this.IsEmpty() {
        return -1
    }
    if this.tail==0 {
        return this.data[this.len-1]

    }
    return this.data[(this.tail-1)%this.len]
}

/** Checks whether the circular queue is empty or not. */
func (this *MyCircularQueue) IsEmpty() bool {
    if this.head==this.tail {
        return true

    }
    return false

}

/** Checks whether the circular queue is full or not. */
func (this *MyCircularQueue) IsFull() bool {
    if (this.tail+1)%this.len==this.head {
        return true
    }
    return false
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章