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 }