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

     1  package collections
     2  
     3  import (
     4  	"container/list"
     5  	"sync"
     6  )
     7  
     8  type Deque struct {
     9  	data *list.List
    10  	mut  *sync.RWMutex
    11  }
    12  
    13  func NewDeque() *Deque {
    14  	return &Deque{data: list.New(), mut: new(sync.RWMutex)}
    15  }
    16  
    17  func (q *Deque) PutLeft(v interface{}) {
    18  	defer q.mut.Unlock()
    19  	q.mut.Lock()
    20  	q.data.PushFront(v)
    21  }
    22  
    23  func (q *Deque) PutRight(v interface{}) {
    24  	defer q.mut.Unlock()
    25  	q.mut.Lock()
    26  	q.data.PushBack(v)
    27  }
    28  
    29  func (q *Deque) GetLeft() (interface{}, bool) {
    30  	defer q.mut.Unlock()
    31  	q.mut.Lock()
    32  	if q.data.Len() > 0 {
    33  		iter := q.data.Front()
    34  		v := iter.Value
    35  		q.data.Remove(iter)
    36  		return v, true
    37  	}
    38  	return nil, false
    39  }
    40  
    41  func (q *Deque) GetRight() (interface{}, bool) {
    42  	defer q.mut.Unlock()
    43  	q.mut.Lock()
    44  	if q.data.Len() > 0 {
    45  		iter := q.data.Back()
    46  		v := iter.Value
    47  		q.data.Remove(iter)
    48  		return v, true
    49  	}
    50  	return nil, false
    51  }
    52  
    53  func (q *Deque) Qsize() int {
    54  	defer q.mut.RUnlock()
    55  	q.mut.RLock()
    56  	return q.data.Len()
    57  }
    58  
    59  func (q *Deque) IsEmpty() bool {
    60  	defer q.mut.RUnlock()
    61  	q.mut.RLock()
    62  	return !(q.data.Len() > 0)
    63  }