queue.go 750 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package containers
  2. type queueItem struct {
  3. val interface{}
  4. next *queueItem
  5. }
  6. func NewQueue() *Queue {
  7. return new(Queue)
  8. }
  9. type Queue struct {
  10. start *queueItem
  11. top *queueItem
  12. size int
  13. }
  14. func (s *Queue) Size() int {
  15. return s.size
  16. }
  17. func (s *Queue) Push(val ...interface{}) {
  18. item := &queueItem{
  19. val: val[0],
  20. }
  21. if s.top != nil {
  22. s.top.next = item
  23. } else {
  24. s.start = item
  25. }
  26. s.top = item
  27. s.size++
  28. for i := 1; i < len(val); i++ {
  29. it := &queueItem{
  30. val: val[i],
  31. }
  32. item.next, item, s.top = it, it, it
  33. s.size++
  34. }
  35. }
  36. func (s *Queue) Pop() (val interface{}, check bool) {
  37. if s.start == nil {
  38. return
  39. }
  40. val, check = s.start.val, true
  41. s.start = s.start.next
  42. if s.start == nil {
  43. s.top = nil
  44. }
  45. s.size--
  46. return
  47. }