Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. Node = Struct.new :priority, :element, :prev, :next
  2.  
  3. attr_reader :head, :tail, :size
  4.  
  5. def initialize(items = [])
  6. @head, @tail = nil, nil
  7. @size = 0
  8. end
  9.  
  10. # O(n)
  11. def enqueue(priority, element)
  12. n = Node.new priority, element
  13.  
  14. found_min = @tail
  15. while found_min && found_min.priority > n.priority
  16. found_min = found_min.prev
  17. end
  18.  
  19. unless found_min
  20. push_front n
  21. else
  22. insert_after found_min, n
  23. end
  24.  
  25. [priority, element]
  26. end
  27.  
  28. alias_method :<<, :enqueue
  29. alias_method :push, :enqueue
  30.  
  31. # O(1)
  32. def dequeue
  33. return nil unless @head
  34.  
  35. n = @head
  36. if @size == 1
  37. clear
  38. return [n.priority, n.element]
  39. end
  40.  
  41. @head.next.prev = nil
  42. @head = @head.next
  43. @size -= 1
  44. [n.priority, n.element]
  45. end
  46.  
  47. alias_method :pop, :dequeue
  48.  
  49. # O(1)
  50. def min
  51. return nil unless @head
  52. [@head.priority, @head.element]
  53. end
  54.  
  55. alias_method :front, :min
  56.  
  57. # O(1)
  58. def empty?
  59. @size == 0
  60. end
  61.  
  62. # O(1)
  63. def clear
  64. @head, @tail = nil, nil
  65. @size = 0
  66. end
  67.  
  68. # O(n)
  69. def each_forward
  70. return unless @head
  71.  
  72. n = @head
  73. while n
  74. yield n.priority, n.element
  75. n = n.next
  76. end
  77. end
  78.  
  79. alias_method :each, :each_forward
  80.  
  81. # O(n)
  82. def each_backward
  83. return unless @tail
  84.  
  85. n = @tail
  86. while n
  87. yield n.priority, n.element
  88. n = n.prev
  89. end
  90. end
  91.  
  92. alias_method :reverse_each, :each_backward
  93.  
  94. def push_front(n)
  95. if @head
  96. n.next = @head
  97. @head.prev = n
  98. @head = n
  99. else
  100. @head = @tail = n
  101. end
  102. @size += 1
  103. end
  104.  
  105. def insert_after(predecessor, successor)
  106. successor.next = predecessor.next
  107. predecessor.next = successor
  108. successor.prev = predecessor
  109. @size += 1
  110. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement