mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-17 16:12:42 +08:00
56 lines
905 B
Go
56 lines
905 B
Go
package collections
|
|
|
|
import "fmt"
|
|
|
|
type CircleQueue[T any] struct {
|
|
data []any
|
|
cap int
|
|
front int
|
|
rear int
|
|
}
|
|
|
|
func NewCircleQueue[T any](cap int) *CircleQueue[T] {
|
|
cap++
|
|
|
|
return &CircleQueue[T]{
|
|
data: make([]any, cap),
|
|
cap: cap,
|
|
}
|
|
}
|
|
|
|
func (q *CircleQueue[T]) Push(data any) bool {
|
|
if (q.rear+1)%q.cap == q.front {
|
|
return false
|
|
}
|
|
|
|
q.data[q.rear] = data
|
|
q.rear = (q.rear + 1) % q.cap
|
|
return true
|
|
}
|
|
func (q *CircleQueue[T]) Pop() any {
|
|
if q.rear == q.front {
|
|
return nil
|
|
}
|
|
|
|
data := q.data[q.front]
|
|
q.data[q.front] = nil
|
|
q.front = (q.front + 1) % q.cap
|
|
return data
|
|
}
|
|
|
|
func (q *CircleQueue[T]) Size() int {
|
|
return (q.rear - q.front + q.cap) % q.cap
|
|
}
|
|
|
|
func (q *CircleQueue[T]) IsFull() bool {
|
|
return (q.rear+1)%q.cap == q.front
|
|
}
|
|
|
|
func (q *CircleQueue[T]) IsEmpty() bool {
|
|
return q.front == q.rear
|
|
}
|
|
|
|
func (q *CircleQueue[T]) Show() string {
|
|
return fmt.Sprintf("%v", q.data)
|
|
}
|