Class: RubyCollections::Deque

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_collections/deque.rb

Instance Method Summary collapse

Constructor Details

#initializeDeque

TODO: implement iterator TODO: implement to_a



8
9
10
11
# File 'lib/ruby_collections/deque.rb', line 8

def initialize
  @hash = {size: 0, front: {data: nil, next: :rear, prev: nil}, 
          rear: {data: nil, next: nil, prev: :front}}
end

Instance Method Details

#add(data, index = 0) ⇒ Object



29
30
31
32
33
34
# File 'lib/ruby_collections/deque.rb', line 29

def add(data, index = 0)
  return nil if index > size
  if index == 0 then add_first(data) and return end
  setNext(getNode(index-1), data) if index > 0 and index < size
  hash[:size] += 1 
end

#add_first(data) ⇒ Object



36
37
38
39
# File 'lib/ruby_collections/deque.rb', line 36

def add_first(data)
  setNext(:front, data)
  hash[:size] += 1
end

#add_last(data) ⇒ Object



41
42
43
44
# File 'lib/ruby_collections/deque.rb', line 41

def add_last(data)
  setPrev(:rear, data)
  hash[:size] += 1
end

#empty?Boolean



13
14
15
# File 'lib/ruby_collections/deque.rb', line 13

def empty?
  size.zero?
end

#get(index) ⇒ Object



46
47
48
49
# File 'lib/ruby_collections/deque.rb', line 46

def get(index)
  return nil if index >= size
  hash[getNode(index)][:data]
end

#headObject



21
22
23
# File 'lib/ruby_collections/deque.rb', line 21

def head
  hash[front[:next]][:data]
end

#remove(index) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/ruby_collections/deque.rb', line 56

def remove(index)
  return nil if index >= size or index < 0
  node_id = getNode(index)
  hash[getNext(node_id)][:prev] = getPrev(node_id)
  hash[getPrev(node_id)][:next] = getNext(node_id)
  hash.delete(node_id)
  hash[:size] -= 1
end

#remove_firstObject



65
66
67
68
# File 'lib/ruby_collections/deque.rb', line 65

def remove_first
  return nil if empty?
  remove(0)
end

#remove_lastObject



70
71
72
73
74
75
76
77
78
# File 'lib/ruby_collections/deque.rb', line 70

def remove_last
  return nil if empty?
  node_id = getPrev(:rear)
  prev_id = getPrev(node_id)
  hash[prev_id][:next] = :rear
  rear[:prev] = prev_id
  hash.delete(node_id)
  hash[:size] -= 1
end

#set(index, data) ⇒ Object



51
52
53
54
# File 'lib/ruby_collections/deque.rb', line 51

def set(index, data)
  return nil if index >= size
  hash[getNode(index)][:data] = data
end

#sizeObject



17
18
19
# File 'lib/ruby_collections/deque.rb', line 17

def size
  hash[:size]
end

#tailObject



25
26
27
# File 'lib/ruby_collections/deque.rb', line 25

def tail
  hash[rear[:prev]][:data]
end

#to_sObject



80
81
82
83
84
85
86
87
88
89
# File 'lib/ruby_collections/deque.rb', line 80

def to_s
  return "" if empty?
  data = []
  node_id = :front
  size.times do
    node_id = getNext(node_id)
    data << hash[node_id][:data]
  end
  return data.to_s
end