gitee.com/lh-her-team/common@v1.5.1/queue/queue.go (about)

     1  package queue
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"sync"
     7  )
     8  
     9  type Element interface{}
    10  
    11  type Queue interface {
    12  	PushFront(e Element)   // 向队头添加元素
    13  	PushBack(e Element)    // 向队尾添加元素
    14  	PeekFront() Element    // 查看头部的元素
    15  	PeekBack() Element     // 查看尾部的元素
    16  	PollFront() Element    // 移除头部的元素
    17  	PollBack() Element     // 移除尾部的元素
    18  	Remove(e Element) bool // 删除一个值
    19  	Exist(e Element) bool  // 是否存在
    20  	Size() int             // 获取队列的元素个数
    21  	IsEmpty() bool         // 判断队列是否是空
    22  	Clear() bool           // 清空队列
    23  	NewIterator() *Iterator
    24  }
    25  
    26  type node struct {
    27  	value Element // 当前节点的值
    28  	prev  *node   // 前一个节点
    29  	next  *node   // 下一个节点
    30  }
    31  
    32  type LinkedQueue struct {
    33  	m    sync.Mutex
    34  	head *node // 头节点
    35  	tail *node // 尾节点
    36  	size int   // 大小
    37  }
    38  
    39  func NewLinkedQueue() *LinkedQueue {
    40  	return &LinkedQueue{
    41  		size: 0,
    42  	}
    43  }
    44  
    45  func (queue *LinkedQueue) PushFront(e Element) {
    46  	queue.m.Lock()
    47  	defer queue.m.Unlock()
    48  	newNode := &node{e, nil, queue.head}
    49  	if queue.head == nil {
    50  		queue.head = newNode
    51  		queue.tail = newNode
    52  	} else {
    53  		queue.head.prev = newNode
    54  		queue.head = newNode
    55  	}
    56  	queue.size++
    57  	newNode = nil // nolint: ineffassign
    58  }
    59  
    60  func (queue *LinkedQueue) PushBack(e Element) {
    61  	queue.m.Lock()
    62  	defer queue.m.Unlock()
    63  	newNode := &node{e, queue.tail, nil}
    64  	if queue.tail == nil {
    65  		queue.head = newNode
    66  		queue.tail = newNode
    67  	} else {
    68  		queue.tail.next = newNode
    69  		queue.tail = newNode
    70  	}
    71  	queue.size++
    72  	newNode = nil // nolint: ineffassign
    73  }
    74  
    75  func (queue *LinkedQueue) PeekFront() Element {
    76  	if queue.head == nil {
    77  		return nil
    78  	}
    79  	return queue.head.value
    80  }
    81  
    82  func (queue *LinkedQueue) PeekBack() Element {
    83  	if queue.tail == nil {
    84  		return nil
    85  	}
    86  	return queue.tail.value
    87  }
    88  
    89  // 移除队列中最前面的元素
    90  func (queue *LinkedQueue) PollFront() Element {
    91  	queue.m.Lock()
    92  	defer queue.m.Unlock()
    93  	if queue.IsEmpty() {
    94  		return nil
    95  	}
    96  	if queue.head == nil {
    97  		fmt.Println("Poll Empty queue.")
    98  		return nil
    99  	}
   100  	queue.size--
   101  	firstNode := queue.head
   102  	queue.head = firstNode.next
   103  	if queue.head != nil {
   104  		queue.head.prev = nil
   105  	} else {
   106  		queue.tail = nil
   107  	}
   108  	return firstNode.value
   109  }
   110  
   111  func (queue *LinkedQueue) PollBack() Element {
   112  	queue.m.Lock()
   113  	defer queue.m.Unlock()
   114  	if queue.IsEmpty() {
   115  		return nil
   116  	}
   117  	if queue.tail == nil {
   118  		fmt.Println("PollBottom Empty queue.")
   119  		return nil
   120  	}
   121  	queue.size--
   122  	latestNode := queue.tail
   123  	queue.tail = latestNode.prev
   124  	if queue.tail != nil {
   125  		queue.tail.prev = nil
   126  		queue.tail.next = nil
   127  	} else {
   128  		queue.head = nil
   129  	}
   130  	return latestNode.value
   131  }
   132  
   133  func (queue *LinkedQueue) Remove(e Element) bool {
   134  	queue.m.Lock()
   135  	defer queue.m.Unlock()
   136  	if queue.IsEmpty() {
   137  		return true
   138  	}
   139  	if queue.head == nil {
   140  		return true
   141  	}
   142  	firstNode := queue.head
   143  	queue.del(firstNode, e)
   144  	return true
   145  }
   146  
   147  func (queue *LinkedQueue) del(cNode *node, e Element) *node {
   148  	if queue.IsEmpty() {
   149  		return nil
   150  	}
   151  	if cNode == nil {
   152  		return nil
   153  	}
   154  	nNode := *cNode
   155  	prev := cNode.prev
   156  	next2 := cNode.next
   157  	if cNode.value == e {
   158  		// 查找元素
   159  		if prev == nil && next2 == nil {
   160  			queue.head = nil
   161  			queue.tail = nil
   162  		}
   163  		if prev != nil {
   164  			prev.next = next2
   165  		}
   166  		if next2 != nil {
   167  			next2.prev = prev
   168  		}
   169  		cNode.value = nil
   170  		queue.size--
   171  		return &nNode
   172  	}
   173  	return queue.del(next2, e)
   174  }
   175  
   176  func (queue *LinkedQueue) Exist(e Element) bool {
   177  	queue.m.Lock()
   178  	defer queue.m.Unlock()
   179  	if queue.IsEmpty() {
   180  		return false
   181  	}
   182  	if queue.head == nil {
   183  		return false
   184  	}
   185  	firstNode := queue.head
   186  	return queue.exist(firstNode, e)
   187  }
   188  
   189  func (queue *LinkedQueue) exist(cNode *node, e Element) bool {
   190  	defer func() {
   191  		if err := recover(); err != nil {
   192  			log.Println("LinkedQueue exist", "err", err)
   193  		}
   194  	}()
   195  	if queue.IsEmpty() {
   196  		return false
   197  	}
   198  	next2 := cNode.next
   199  	if cNode.value == e {
   200  		// 查找元素
   201  		return true
   202  	}
   203  	return queue.exist(next2, e)
   204  }
   205  
   206  func (queue *LinkedQueue) Size() int {
   207  	return queue.size
   208  }
   209  
   210  func (queue *LinkedQueue) IsEmpty() bool {
   211  	return queue.size == 0
   212  }
   213  
   214  func (queue *LinkedQueue) Clear() bool {
   215  	if queue.IsEmpty() {
   216  		return false
   217  	}
   218  	queue.m.Lock()
   219  	defer queue.m.Unlock()
   220  	queue.remove()
   221  	return true
   222  }
   223  
   224  func (queue *LinkedQueue) remove() {
   225  	if !queue.IsEmpty() {
   226  		firstNode := queue.head
   227  		if firstNode != nil {
   228  			queue.head = firstNode.next
   229  			firstNode.next = nil
   230  			firstNode.value = nil
   231  		}
   232  		queue.size--
   233  		queue.remove()
   234  	}
   235  }
   236  
   237  // NewIterator creates a new iterator for the cache.
   238  func (queue *LinkedQueue) NewIterator() *Iterator {
   239  	return &Iterator{
   240  		current: queue.head,
   241  	}
   242  }