gitee.com/h79/goutils@v1.22.10/common/queue/linked.go (about)

     1  package queue
     2  
     3  type node struct {
     4  	next *node
     5  	val  any
     6  }
     7  
     8  var _ Queue = (*Linked)(nil)
     9  
    10  // Linked 链表式队列
    11  type Linked struct {
    12  	head     *node
    13  	tail     *node
    14  	length   int
    15  	capacity int
    16  }
    17  
    18  func NewLinked(capacity int) *Linked {
    19  	if capacity <= 0 {
    20  		capacity = minCapacity
    21  	}
    22  	if capacity > maxCapacity {
    23  		capacity = maxCapacity
    24  	}
    25  	return &Linked{capacity: capacity}
    26  }
    27  
    28  func (lq *Linked) Add(val any) error {
    29  	if lq.length >= lq.capacity {
    30  		return ErrIsFull
    31  	}
    32  	item := &node{
    33  		val: val,
    34  	}
    35  	item.next = lq.head
    36  	lq.head = item
    37  	lq.length++
    38  	return nil
    39  }
    40  
    41  func (lq *Linked) AddTail(val any) error {
    42  	if lq.length >= lq.capacity {
    43  		return ErrIsFull
    44  	}
    45  	item := &node{
    46  		val: val,
    47  	}
    48  	if lq.tail == nil {
    49  		lq.head = item
    50  	} else {
    51  		lq.tail.next = item
    52  	}
    53  	lq.length++
    54  	lq.tail = item
    55  	return nil
    56  }
    57  
    58  func (lq *Linked) Push(val any) error {
    59  	return lq.Add(val)
    60  }
    61  
    62  func (lq *Linked) Pop() any {
    63  	if lq.head != nil {
    64  		val := lq.head.val
    65  		lq.head = lq.head.next
    66  		if lq.head == nil {
    67  			lq.tail = nil
    68  		}
    69  		lq.length--
    70  		return val
    71  	}
    72  	return nil
    73  }
    74  
    75  func (lq *Linked) Peek() any {
    76  	if lq.head != nil {
    77  		return lq.head.val
    78  	}
    79  	return nil
    80  }
    81  
    82  func (lq *Linked) Empty() bool {
    83  	return lq.head == nil
    84  }
    85  
    86  func (lq *Linked) Len() int {
    87  	return lq.length
    88  }
    89  
    90  func (lq *Linked) Cap() int {
    91  	return lq.length
    92  }
    93  
    94  // Find return index -1 not found.
    95  func (lq *Linked) Find(fn IndexFunc) (any, int) {
    96  	index := 0
    97  	for i := lq.head; i != nil; i = i.next {
    98  		if fn(i.val, index) {
    99  			return i.val, index
   100  		}
   101  		index++
   102  	}
   103  	return nil, -1
   104  }
   105  
   106  func (lq *Linked) Foreach(fn IndexFunc) {
   107  	index := 0
   108  	for i := lq.head; i != nil; i = i.next {
   109  		if fn(i.val, index) {
   110  			return
   111  		}
   112  		index++
   113  	}
   114  }
   115  
   116  func (lq *Linked) ToList() []any {
   117  	buf := make([]any, lq.Len())
   118  	index := 0
   119  	for i := lq.head; i != nil; i = i.next {
   120  		buf[index] = i.val
   121  		index++
   122  	}
   123  	return buf
   124  }