Go猜想录
大道至简,悟者天成
队列

摘要

  • 链表和数组实现队列的区别
  • 循环队列的实现方法

数组实现队列

  • head 指针指向队头,tail 指针指向队尾
  • 默认 head 为 0,tail 为 -1
  • head > tail 时表示队列为空,队列的第一个元素从 0 开始
package main

import (
	"fmt"
	"strings"
)

const N = 100010

var q [N]int

// head 表示队头,tail表示队尾
var head = 0
var tail = -1

// 向队尾插入一个数
func push(x int) {
	tail++
	q[tail] = x
}

// 从队头弹出一个数
func pop() {
	head++
}

// 判断队列是否为空
func isEmpty() bool {
	return head > tail
}

// 队头的值
func peek() int {
	return q[head]
}

func main() {
	var sb strings.Builder
	var m int
	fmt.Scan(&m)
	for i := 0; i < m; i++ {
		var op string
		var x int
		fmt.Scan(&op)
		switch op {
		case "push":
			fmt.Scan(&x)
			push(x)
		case "pop":
			pop()
		case "empty":
			if isEmpty() {
				sb.WriteString("YES\n")
			} else {
				sb.WriteString("NO\n")
			}
		case "query":
			fmt.Fprintf(&sb, "%d\n", peek())
		}
	}

	fmt.Print(sb.String())
}

循环队列的实现方法

go channel 中的实现

package main

import (
	"fmt"
)

type CircularQueue struct {
	buffer []int
	cap    int
	sendx  int // 写指针
	recvx  int // 读指针
	count  int // 当前缓冲区中的元素数量
}

func NewCircularQueue(capacity int) *CircularQueue {
	return &CircularQueue{
		buffer: make([]int, capacity),
		cap:    capacity,
	}
}

func (cq *CircularQueue) Send(value int) bool {
	if cq.count == cq.cap {
		// 队列已满
		return false
	}
	cq.buffer[cq.sendx] = value
	cq.sendx = (cq.sendx + 1) % cq.cap
	cq.count++
	return true
}

func (cq *CircularQueue) Receive() (int, bool) {
	if cq.count == 0 {
		// 队列为空
		return 0, false
	}
	value := cq.buffer[cq.recvx]
	cq.recvx = (cq.recvx + 1) % cq.cap
	cq.count--
	return value, true
}

func main() {
	cq := NewCircularQueue(3)

	// 发送数据
	cq.Send(1)
	cq.Send(2)
	cq.Send(3)
	fmt.Println("Queue after sending:", cq.buffer)

	// 尝试发送到满队列
	if !cq.Send(4) {
		fmt.Println("Queue is full, can't send more data.")
	}

	// 接收数据
	val, _ := cq.Receive()
	fmt.Println("Received:", val)

	val, _ = cq.Receive()
	fmt.Println("Received:", val)

	// 发送新数据
	cq.Send(4)
	fmt.Println("Queue after more sending:", cq.buffer)
}
Queue after sending: [1 2 3]
Queue is full, can't send more data.
Received: 1
Received: 2
Queue after more sending: [4 2 3]

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。