队列
摘要
- 链表和数组实现队列的区别
- 循环队列的实现方法
数组实现队列
- 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 国际许可协议进行许可。