算法Go语言描述📌datastruct📌3_stack&queue.go
package datastruct
// 栈和队列都可以用数组或链表来实现
type ArrayStack []any
func (s ArrayStack) Size() int {
return len(s)
}
func (s ArrayStack) IsEmpty() bool {
return s.Size() == 0
}
func (s *ArrayStack) Clear() {
*s = nil
}
func (s *ArrayStack) Push(v any) {
*s = append(*s, v)
}
func (s *ArrayStack) Pop() any {
size := s.Size()
if size == 0 {
return nil
}
end := size - 1
top := (*s)[end]
(*s)[end] = nil // don't stop the GC from reclaiming the item eventually
*s = (*s)[:end]
return top
}
func (s ArrayStack) Top() any {
size := s.Size()
if size == 0 {
return nil
}
return s[size-1]
}
func (s ArrayStack) Bottom() any {
if s.Size() == 0 {
return nil
}
return s[0]
}
type LinkedQueue struct {
head, tail *ListNode // 链表头尾
size int // 队列长度
}
func (q *LinkedQueue) Size() int {
return q.size
}
func (q *LinkedQueue) IsEmpty() bool {
return q.size == 0
}
func (q *LinkedQueue) Clear() {
q.head = nil
q.tail = nil
q.size = 0
}
func (q *LinkedQueue) Push(v any) {
node := &ListNode{Val: v}
if q.size == 0 {
q.head = node
q.tail = node
} else {
q.tail.Next = node
q.tail = q.tail.Next
}
q.size++
}
func (q *LinkedQueue) Pop() any {
if q.size == 0 {
return nil
}
val := q.head.Val
q.head = q.head.Next
if q.size == 1 {
q.tail = nil
}
q.size--
return val
}
func (q *LinkedQueue) Front() any {
if q.size == 0 {
return nil
}
return q.head.Val
}
func (q *LinkedQueue) Back() any {
if q.size == 0 {
return nil
}
return q.tail.Val
}
// Go中还能使用带缓冲的channel实现单向有锁队列。