diff --git a/util/queue/squeue.go b/util/queue/squeue.go index c99ebf1..ba6f62b 100644 --- a/util/queue/squeue.go +++ b/util/queue/squeue.go @@ -53,8 +53,12 @@ func (s *SQueue[ElementType]) Len() int { s.locker.RLock() defer s.locker.RUnlock() + return s.len() +} + +func (s *SQueue[ElementType]) len() int { if s.head <= s.tail { - return s.head - s.tail + return s.tail - s.head } //(len(s.elements)-1-s.head)+(s.tail+1) @@ -101,12 +105,16 @@ func (s *SQueue[ElementType]) RemoveElement(elementNum int) (removeNum int) { s.locker.Lock() defer s.locker.Unlock() - for ;s.head == s.tail && removeNum >= elementNum;{ - removeNum++ - s.head++ - s.head = s.head%len(s.elements) + lens := s.len() + if elementNum > lens{ + removeNum = lens + }else{ + removeNum = elementNum } + + s.head = (s.head + removeNum)%len(s.elements) + return } diff --git a/util/queue/syncqueue_test.go b/util/queue/syncqueue_test.go index 3e5efa9..8e89ae4 100644 --- a/util/queue/syncqueue_test.go +++ b/util/queue/syncqueue_test.go @@ -12,7 +12,7 @@ func Test_Example(t *testing.T) { t.Log("is empty :", queue.IsEmpty()) t.Log("is full :", queue.IsFull()) - //3.游标使用 + //3.游标使用,打印所有数据 cursor := queue.GetCursor() cursor.First() for { @@ -23,7 +23,7 @@ func Test_Example(t *testing.T) { t.Log("elem:", elem) } - //4.push数据 + //4.push数据,塞满队列 for i := 0; i < 6; i++ { t.Log("push:", queue.Push(i)) } @@ -31,7 +31,7 @@ func Test_Example(t *testing.T) { t.Log("is empty :", queue.IsEmpty()) t.Log("is full :", queue.IsFull()) - //5.游标遍历 + //5.使用游标遍历所有数据 cursor.First() for { elem, ret := cursor.Next() @@ -41,7 +41,21 @@ func Test_Example(t *testing.T) { t.Log("elem:", elem) } - //pop数据所有 + //6.删除2个元素 + removeNum := queue.RemoveElement(2) + t.Log("Remove Num:", removeNum) + + //7.游标遍历 + cursor.First() + for { + elem, ret := cursor.Next() + if ret == false { + break + } + t.Log("elem:", elem) + } + + //8.pop数据所有 for i := 0; i < 6; i++ { elem, ret := queue.Pop() t.Log("pop:", elem, "-", ret, " len:", queue.Len())