环形队列
主要确定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
}

SyntaxError
199 声望19 粉丝