github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/lifo_queue.go (about)

     1  package collections
     2  
     3  import (
     4  	"container/list"
     5  	"sync"
     6  )
     7  
     8  type LifoQueue struct {
     9  	data *list.List
    10  	mut  *sync.RWMutex
    11  }
    12  
    13  func NewLifoQueue() *LifoQueue {
    14  	return &LifoQueue{data: list.New(), mut: new(sync.RWMutex)}
    15  }
    16  
    17  func (q *LifoQueue) Put(v interface{}) {
    18  	defer q.mut.Unlock()
    19  	q.mut.Lock()
    20  	q.data.PushFront(v)
    21  }
    22  
    23  func (q *LifoQueue) Get() (interface{}, bool) {
    24  	defer q.mut.Unlock()
    25  	q.mut.Lock()
    26  	if q.data.Len() > 0 {
    27  		iter := q.data.Front()
    28  		v := iter.Value
    29  		q.data.Remove(iter)
    30  		return v, true
    31  	}
    32  	return nil, false
    33  }
    34  
    35  func (q *LifoQueue) Qsize() int {
    36  	defer q.mut.RUnlock()
    37  	q.mut.RLock()
    38  	return q.data.Len()
    39  }
    40  
    41  func (q *LifoQueue) IsEmpty() bool {
    42  	defer q.mut.RUnlock()
    43  	q.mut.RLock()
    44  	return !(q.data.Len() > 0)
    45  }