环形队列
主要确定head和tail指针分别代表啥, 我这里规定:
head:代表要写的索引位置
tail:代表要读的索引位置
两个值一直自增就行,然后对容量取模
要考虑的两种情况:
1.队列满了:这种head==tail
2.队列空了:这种同样head==tail
那么如何判断队列是满了还是空了
1.当push完成一个元素后,更新head,假如head追上tail了,那么就是满了
2.当pop完成一个元素后,更新tail,假如tail追上head了,那么就是空了
代码实现:
package main
import "fmt"
/*
CircleQueue
*/
type CircleQueue struct {
maxSize int // 假设最大长度为5
array []int // 假设长度为5,也可以用切片来实现
head int // 要写的位置
tail int // 要读的位置
isFull bool
isEmpty bool
}
func NewCircleQueue(cap int) *CircleQueue {
return &CircleQueue{
maxSize: cap,
array: make([]int, cap),
isEmpty: true,
}
}
func (c *CircleQueue) Push(val int) bool {
// push加的过程中如果俩数相等了,那么就是满了
if c.isFull {
return false
}
c.isEmpty = false
c.array[c.head] = val
c.head = (c.head + 1) % c.maxSize
if c.head == c.tail {
c.isFull = true
}
return true
}
func (c *CircleQueue) Pop() (int, bool) {
// false就是空了,非false的话,pop完设置成false
if c.isEmpty {
return 0, false
}
c.isFull = false
temp := c.array[c.tail]
c.tail = (c.tail + 1) % c.maxSize
if c.tail == c.head {
c.isEmpty = true
}
return temp, true
}
func main() {
cq := NewCircleQueue(2)
fmt.Println(cq.Pop())
fmt.Println(cq.Push(1))
fmt.Println(cq.Push(2))
fmt.Println(cq.Push(3))
fmt.Println(cq.Pop())
fmt.Println(cq.Push(3))
fmt.Println(cq.Pop())
fmt.Println(cq.Pop())
//0 false
//true
//true
//false
//1 true
//true
//2 true
//3 true
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。