algorithmable 0.11.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +8 -1
- data/lib/algorithmable/cups/primitives.rb +98 -0
- data/lib/algorithmable/cups.rb +5 -0
- data/lib/algorithmable/data_structs/linked_list/base.rb +92 -0
- data/lib/algorithmable/data_structs/linked_list/doubly.rb +86 -0
- data/lib/algorithmable/data_structs/linked_list/singly.rb +127 -0
- data/lib/algorithmable/data_structs/linked_list.rb +9 -91
- data/lib/algorithmable/data_structs.rb +8 -10
- data/lib/algorithmable/sort/binary_heap.rb +1 -1
- data/lib/algorithmable/version.rb +1 -1
- data/lib/algorithmable.rb +1 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 484ef490b06d5cd0c396fc76651dec47edd406c8
|
4
|
+
data.tar.gz: ea9ba9dd9e2e6cbc886e3bf1a3022eda64badb21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d022c89e7953ee18649511d595c126892d7eb8d1c3bedfd21bdcc7804caf2cf592c7ecd8d019a3ec12555728ba17e541170b0b660d7368a879d5ff27961c18bc
|
7
|
+
data.tar.gz: 4497b73d3190fa9492a8c3966a50c2aa110dafd5e80656218c275d58ece61462859f4598c15a8c8441aa493afef371e09cc9f2b4bd183fb77ba760d98e472e69
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -12,6 +12,7 @@ Library also contains solutions for several puzzles solved by implemented algori
|
|
12
12
|
## Data Structures
|
13
13
|
|
14
14
|
- Bag (primitive collection without ability to delete elements)
|
15
|
+
- Singly Linked List
|
15
16
|
- Doubly Linked List
|
16
17
|
- Deque (double-ended queue)
|
17
18
|
- Queue (FIFO)
|
@@ -19,6 +20,7 @@ Library also contains solutions for several puzzles solved by implemented algori
|
|
19
20
|
- Ordered Symbol Table BST. Implementation using Unbalanced Binary Search Tree.
|
20
21
|
- Minimum Priority Queue
|
21
22
|
- Maximum Priority Queue
|
23
|
+
- Ordered Symbol Table
|
22
24
|
|
23
25
|
## Graphs
|
24
26
|
|
@@ -37,13 +39,18 @@ Library also contains solutions for several puzzles solved by implemented algori
|
|
37
39
|
|
38
40
|
- Bubble sort
|
39
41
|
- Merge sort
|
40
|
-
-
|
42
|
+
- Heapsort ( Binary Heap )
|
41
43
|
|
42
44
|
## Algorithms
|
43
45
|
|
44
46
|
- Levenshtein Distance algorithm (http://www.levenshtein.net)
|
45
47
|
- Lawrence Philips' Metaphone Algorithm (http://aspell.net/metaphone)
|
46
48
|
|
49
|
+
## Puzzles
|
50
|
+
|
51
|
+
- Shunting-yard algorithm ( Dijkstras two stacks algorithm )
|
52
|
+
- Josephus problem
|
53
|
+
|
47
54
|
# Usage
|
48
55
|
|
49
56
|
It is always better to check unit tests in order to understand how things going on.
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Algorithmable
|
2
|
+
module Cups
|
3
|
+
module Primitives
|
4
|
+
# this module contains a lot of C style code. It is done intentionally.
|
5
|
+
# All the methods avoiding using already existent algorithms in Ruby.
|
6
|
+
# Algorithms/solutions should be implemented in place
|
7
|
+
|
8
|
+
def replace_space_chars(string, expression = '%20')
|
9
|
+
return unless string
|
10
|
+
space_count = 0
|
11
|
+
length = string.length
|
12
|
+
replacement = expression.chars.reverse.freeze
|
13
|
+
length.times { |i| space_count += 1 if string[i] == ' ' }
|
14
|
+
new_length = length + space_count * 2
|
15
|
+
chars = Array.new(new_length, ?\x00)
|
16
|
+
|
17
|
+
(0..length.pred).to_a.reverse_each do |i|
|
18
|
+
if string[i] == ' '
|
19
|
+
replacement.each_with_index do |char, index|
|
20
|
+
j = index + 1
|
21
|
+
chars[new_length - j] = char
|
22
|
+
end
|
23
|
+
new_length = new_length - replacement.length
|
24
|
+
else
|
25
|
+
new_length -= 1
|
26
|
+
chars[new_length] = string[i]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
chars.join
|
31
|
+
end
|
32
|
+
|
33
|
+
def chars_is_uniq?(string)
|
34
|
+
return unless string
|
35
|
+
map = Array.new 127, false
|
36
|
+
string.chars.each do |char|
|
37
|
+
return false if map[char.ord]
|
38
|
+
map[char.ord] = true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def reverse_string(string)
|
43
|
+
return unless string
|
44
|
+
chars = string.chars
|
45
|
+
reversed = ''
|
46
|
+
string.size.times { reversed << chars.pop }
|
47
|
+
reversed
|
48
|
+
end
|
49
|
+
|
50
|
+
def remove_duplicated_chars(chars = [])
|
51
|
+
return if chars.empty? || chars.size < 2
|
52
|
+
array_tail = 1
|
53
|
+
|
54
|
+
chars.size.times do |cur_char_index|
|
55
|
+
next unless cur_char_index.nonzero?
|
56
|
+
prev_char_index = 0
|
57
|
+
|
58
|
+
while prev_char_index < array_tail
|
59
|
+
break if chars[cur_char_index] == chars[prev_char_index]
|
60
|
+
prev_char_index += 1
|
61
|
+
end
|
62
|
+
|
63
|
+
if prev_char_index == array_tail
|
64
|
+
chars[array_tail] = chars[cur_char_index]
|
65
|
+
array_tail += 1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# trim all after new tail
|
70
|
+
chars[0...array_tail]
|
71
|
+
end
|
72
|
+
|
73
|
+
def find_cycled_node(root)
|
74
|
+
return unless root.next or root.next.next
|
75
|
+
slow = root
|
76
|
+
fast = root
|
77
|
+
|
78
|
+
until fast.next.nil?
|
79
|
+
slow = slow.next
|
80
|
+
fast = fast.next.next
|
81
|
+
break if slow == fast
|
82
|
+
end
|
83
|
+
|
84
|
+
# return, no cycle
|
85
|
+
return if fast.next.nil?
|
86
|
+
|
87
|
+
slow = root
|
88
|
+
until slow == fast
|
89
|
+
slow = slow.next
|
90
|
+
fast = fast.next
|
91
|
+
end
|
92
|
+
|
93
|
+
# at this point return value is a node which is tail pointing to.
|
94
|
+
fast
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Algorithmable
|
2
|
+
module DataStructs
|
3
|
+
module LinkedList
|
4
|
+
class Base
|
5
|
+
attr_reader :size, :front
|
6
|
+
|
7
|
+
def initialize(collection = [])
|
8
|
+
@front = nil
|
9
|
+
@back = nil
|
10
|
+
@size = 0
|
11
|
+
collection.each { |item| push_front item }
|
12
|
+
end
|
13
|
+
|
14
|
+
def empty?
|
15
|
+
0 == size
|
16
|
+
end
|
17
|
+
|
18
|
+
def clear!
|
19
|
+
@front = nil
|
20
|
+
@back = nil
|
21
|
+
@size = 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def peek_front
|
25
|
+
@front && @front.item
|
26
|
+
end
|
27
|
+
|
28
|
+
def peek_back
|
29
|
+
@back && @back.item
|
30
|
+
end
|
31
|
+
|
32
|
+
def include?(item)
|
33
|
+
!search(item).nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
def push_back(_item)
|
37
|
+
fail NotImplementedError
|
38
|
+
end
|
39
|
+
|
40
|
+
def push_front(_item)
|
41
|
+
fail NotImplementedError
|
42
|
+
end
|
43
|
+
|
44
|
+
def pop_back
|
45
|
+
fail NotImplementedError
|
46
|
+
end
|
47
|
+
|
48
|
+
def pop_front
|
49
|
+
fail NotImplementedError
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete(_item)
|
53
|
+
fail NotImplementedError
|
54
|
+
end
|
55
|
+
|
56
|
+
def reverse
|
57
|
+
fail NotImplementedError
|
58
|
+
end
|
59
|
+
|
60
|
+
def merge(_other_list)
|
61
|
+
fail NotImplementedError
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def search(item)
|
67
|
+
return if empty?
|
68
|
+
node = @front
|
69
|
+
while node
|
70
|
+
break if node.item == item
|
71
|
+
node = node.next
|
72
|
+
end
|
73
|
+
node
|
74
|
+
end
|
75
|
+
|
76
|
+
def each(&block)
|
77
|
+
nodes = []
|
78
|
+
node = @front
|
79
|
+
until node.nil?
|
80
|
+
nodes << node
|
81
|
+
node = node.next
|
82
|
+
end
|
83
|
+
nodes.each(&block)
|
84
|
+
end
|
85
|
+
|
86
|
+
def new_node(_item, *_args)
|
87
|
+
fail NotImplementedError
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Algorithmable
|
2
|
+
module DataStructs
|
3
|
+
module LinkedList
|
4
|
+
class Doubly < Base
|
5
|
+
class Node
|
6
|
+
attr_accessor :item, :prev, :next
|
7
|
+
|
8
|
+
def initialize(item, prev_pointer = nil, next_pointer = nil)
|
9
|
+
@item = item
|
10
|
+
@prev = prev_pointer
|
11
|
+
@next = next_pointer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private_constant :Node
|
16
|
+
|
17
|
+
def push_front(item)
|
18
|
+
prev_front = @front
|
19
|
+
node = new_node item, nil, prev_front
|
20
|
+
@front = node
|
21
|
+
|
22
|
+
if prev_front
|
23
|
+
prev_front.prev = node
|
24
|
+
else
|
25
|
+
@back = node
|
26
|
+
end
|
27
|
+
|
28
|
+
@size += 1
|
29
|
+
item
|
30
|
+
end
|
31
|
+
|
32
|
+
def push_back(item)
|
33
|
+
prev_back = @back
|
34
|
+
node = Node.new item, prev_back, nil
|
35
|
+
@back = node
|
36
|
+
|
37
|
+
if prev_back
|
38
|
+
prev_back.next = node
|
39
|
+
else
|
40
|
+
@front = node
|
41
|
+
end
|
42
|
+
|
43
|
+
@size += 1
|
44
|
+
item
|
45
|
+
end
|
46
|
+
|
47
|
+
def pop_front
|
48
|
+
delete peek_front
|
49
|
+
end
|
50
|
+
|
51
|
+
def pop_back
|
52
|
+
delete peek_back
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete(item)
|
56
|
+
node = search(item)
|
57
|
+
return unless node
|
58
|
+
|
59
|
+
prev_node = node.prev
|
60
|
+
next_node = node.next
|
61
|
+
|
62
|
+
if prev_node.nil?
|
63
|
+
@front = next_node
|
64
|
+
else
|
65
|
+
prev_node.next = next_node
|
66
|
+
end
|
67
|
+
|
68
|
+
if next_node.nil?
|
69
|
+
@back = prev_node
|
70
|
+
else
|
71
|
+
next_node.prev = prev_node
|
72
|
+
end
|
73
|
+
|
74
|
+
@size -= 1
|
75
|
+
item
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def new_node(item, prev_pointer = nil, next_pinter = nil)
|
81
|
+
Node.new item, prev_pointer, next_pinter
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module Algorithmable
|
2
|
+
module DataStructs
|
3
|
+
module LinkedList
|
4
|
+
class Singly < Base
|
5
|
+
class Node
|
6
|
+
attr_accessor :item, :next
|
7
|
+
|
8
|
+
def initialize(item, next_pointer = nil)
|
9
|
+
@item = item
|
10
|
+
@next = next_pointer
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private_constant :Node
|
15
|
+
|
16
|
+
def push_front(obj)
|
17
|
+
node = new_node(obj)
|
18
|
+
if @front
|
19
|
+
node.next = @front
|
20
|
+
@front = node
|
21
|
+
else
|
22
|
+
@front = node
|
23
|
+
@back = @front
|
24
|
+
end
|
25
|
+
@size += 1
|
26
|
+
obj
|
27
|
+
end
|
28
|
+
|
29
|
+
def push_back(obj)
|
30
|
+
node = new_node(obj)
|
31
|
+
if @back
|
32
|
+
@back.next = node
|
33
|
+
@back = node
|
34
|
+
else
|
35
|
+
@front = node
|
36
|
+
@back = @front
|
37
|
+
end
|
38
|
+
@size += 1
|
39
|
+
obj
|
40
|
+
end
|
41
|
+
|
42
|
+
def pop_front
|
43
|
+
return unless @front
|
44
|
+
node = @front
|
45
|
+
|
46
|
+
if @front == @back
|
47
|
+
clear!
|
48
|
+
else
|
49
|
+
@front = @front.next
|
50
|
+
@size -= 1
|
51
|
+
end
|
52
|
+
|
53
|
+
node.item
|
54
|
+
end
|
55
|
+
|
56
|
+
def pop_back
|
57
|
+
return unless @back
|
58
|
+
node = @back
|
59
|
+
if @front == @back
|
60
|
+
clear!
|
61
|
+
else
|
62
|
+
prev = @front
|
63
|
+
prev = prev.next while prev.next != @back
|
64
|
+
@back = prev
|
65
|
+
@back.next = nil
|
66
|
+
@size -= 1
|
67
|
+
end
|
68
|
+
node.item
|
69
|
+
end
|
70
|
+
|
71
|
+
def delete(item)
|
72
|
+
tmp_node = @front
|
73
|
+
prev_node = nil
|
74
|
+
|
75
|
+
until tmp_node.nil?
|
76
|
+
if tmp_node.item == item
|
77
|
+
if tmp_node == @front
|
78
|
+
next_node = @front.next
|
79
|
+
@back = next_node if @front == @back
|
80
|
+
@front = next_node
|
81
|
+
@size -= 1
|
82
|
+
else
|
83
|
+
prev_node.next = tmp_node.next
|
84
|
+
@back = prev_node if tmp_node == @back
|
85
|
+
@size -= 1
|
86
|
+
end
|
87
|
+
return true
|
88
|
+
else
|
89
|
+
prev_node = tmp_node
|
90
|
+
end
|
91
|
+
|
92
|
+
tmp_node = tmp_node.next
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def reverse_imp(root)
|
99
|
+
return root if root.nil? || root.next.nil?
|
100
|
+
node = reverse_imp(root.next)
|
101
|
+
root.next.next = root
|
102
|
+
root.next = nil
|
103
|
+
node
|
104
|
+
end
|
105
|
+
|
106
|
+
def remove_next(prev)
|
107
|
+
if prev.nil?
|
108
|
+
pop_front
|
109
|
+
elsif prev.next == @back
|
110
|
+
@back = prev
|
111
|
+
@back.next = nil
|
112
|
+
@size -= 1
|
113
|
+
elsif prev == @back
|
114
|
+
return
|
115
|
+
else
|
116
|
+
prev.next = prev.next.next
|
117
|
+
@size -= 1
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def new_node(item, next_pinter = nil)
|
122
|
+
Node.new item, next_pinter
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -1,101 +1,19 @@
|
|
1
1
|
module Algorithmable
|
2
2
|
module DataStructs
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module LinkedList
|
4
|
+
autoload :Base, 'algorithmable/data_structs/linked_list/base'
|
5
|
+
autoload :Singly, 'algorithmable/data_structs/linked_list/singly'
|
6
|
+
autoload :Doubly, 'algorithmable/data_structs/linked_list/doubly'
|
6
7
|
|
7
|
-
|
8
|
-
@head = nil
|
9
|
-
@tail = nil
|
10
|
-
@length = 0
|
11
|
-
@op_counter = 0
|
12
|
-
end
|
13
|
-
|
14
|
-
def unshift(data)
|
15
|
-
link_head_node data
|
16
|
-
end
|
17
|
-
|
18
|
-
def push(data)
|
19
|
-
link_tail_node data
|
20
|
-
end
|
21
|
-
|
22
|
-
def first
|
23
|
-
@head ? @head.dup : fail_index_error
|
24
|
-
end
|
25
|
-
|
26
|
-
def last
|
27
|
-
@tail ? @tail.dup : fail_index_error
|
28
|
-
end
|
29
|
-
|
30
|
-
def each(&block)
|
31
|
-
next_node = @head
|
32
|
-
nodes = []
|
33
|
-
while next_node
|
34
|
-
nodes << next_node
|
35
|
-
next_node = next_node.succ
|
36
|
-
end
|
37
|
-
nodes.each(&block)
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def link_head_node(data)
|
43
|
-
prev_head = @head
|
44
|
-
node = make_node data, nil, prev_head
|
45
|
-
@head = node
|
46
|
-
|
47
|
-
if prev_head
|
48
|
-
prev_head.pred = node
|
49
|
-
else
|
50
|
-
@tail = node
|
51
|
-
end
|
8
|
+
private_constant :Base
|
52
9
|
|
53
|
-
|
54
|
-
|
10
|
+
def new_singly_linked_list(collection = [])
|
11
|
+
Singly.new collection
|
55
12
|
end
|
56
13
|
|
57
|
-
def
|
58
|
-
|
59
|
-
node = make_node data, prev_tail, nil
|
60
|
-
@tail = node
|
61
|
-
|
62
|
-
if prev_tail
|
63
|
-
prev_tail.succ = node
|
64
|
-
else
|
65
|
-
@head = node
|
66
|
-
end
|
67
|
-
|
68
|
-
bump_length!
|
69
|
-
bump_op_counter!
|
70
|
-
end
|
71
|
-
|
72
|
-
def make_node(data, pred = nil, succ = nil)
|
73
|
-
Node.new data, pred, succ
|
74
|
-
end
|
75
|
-
|
76
|
-
def bump_length!
|
77
|
-
@length = @length.next
|
78
|
-
end
|
79
|
-
|
80
|
-
def bump_op_counter!
|
81
|
-
@op_counter = @op_counter.next
|
82
|
-
end
|
83
|
-
|
84
|
-
def fail_index_error(message = nil)
|
85
|
-
fail IndexError, message
|
86
|
-
end
|
87
|
-
|
88
|
-
class Node
|
89
|
-
attr_accessor :pred, :succ
|
90
|
-
attr_reader :data
|
91
|
-
|
92
|
-
def initialize(data, pred = nil, succ = nil)
|
93
|
-
@data = data
|
94
|
-
@pred = pred
|
95
|
-
@succ = succ
|
96
|
-
end
|
14
|
+
def new_doubly_linked_list(collection = [])
|
15
|
+
Doubly.new collection
|
97
16
|
end
|
98
|
-
private_constant :Node
|
99
17
|
end
|
100
18
|
end
|
101
19
|
end
|
@@ -8,14 +8,12 @@ module Algorithmable
|
|
8
8
|
autoload :OrderedSymbolTable, 'algorithmable/data_structs/ordered_symbol_table'
|
9
9
|
autoload :Heap, 'algorithmable/data_structs/heap'
|
10
10
|
|
11
|
+
include LinkedList
|
12
|
+
|
11
13
|
def new_bag
|
12
14
|
Bag.new
|
13
15
|
end
|
14
16
|
|
15
|
-
def new_linked_list
|
16
|
-
LinkedList.new
|
17
|
-
end
|
18
|
-
|
19
17
|
def new_fifo_queue
|
20
18
|
Queue.new
|
21
19
|
end
|
@@ -28,16 +26,16 @@ module Algorithmable
|
|
28
26
|
OrderedSymbolTable.new(key_type, value_type)
|
29
27
|
end
|
30
28
|
|
31
|
-
def
|
32
|
-
Heap::Max.new(collection)
|
29
|
+
def new_priority_queue(collection, &block)
|
30
|
+
Heap::Max.new(collection, &block)
|
33
31
|
end
|
34
32
|
|
35
|
-
|
33
|
+
def new_max_priority_queue(collection = [])
|
34
|
+
Heap::Max.new(collection)
|
35
|
+
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def new_min_priority_queue(collection = [])
|
38
38
|
Heap::Min.new(collection)
|
39
39
|
end
|
40
|
-
|
41
|
-
alias_method :new_min_priority_queue, :new_min_priority_heap
|
42
40
|
end
|
43
41
|
end
|
data/lib/algorithmable.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algorithmable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Lishtaba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -140,6 +140,8 @@ files:
|
|
140
140
|
- algorithmable.gemspec
|
141
141
|
- cucumber.yml
|
142
142
|
- lib/algorithmable.rb
|
143
|
+
- lib/algorithmable/cups.rb
|
144
|
+
- lib/algorithmable/cups/primitives.rb
|
143
145
|
- lib/algorithmable/data_structs.rb
|
144
146
|
- lib/algorithmable/data_structs/bag.rb
|
145
147
|
- lib/algorithmable/data_structs/deque.rb
|
@@ -148,6 +150,9 @@ files:
|
|
148
150
|
- lib/algorithmable/data_structs/heap/max.rb
|
149
151
|
- lib/algorithmable/data_structs/heap/min.rb
|
150
152
|
- lib/algorithmable/data_structs/linked_list.rb
|
153
|
+
- lib/algorithmable/data_structs/linked_list/base.rb
|
154
|
+
- lib/algorithmable/data_structs/linked_list/doubly.rb
|
155
|
+
- lib/algorithmable/data_structs/linked_list/singly.rb
|
151
156
|
- lib/algorithmable/data_structs/ordered_symbol_table.rb
|
152
157
|
- lib/algorithmable/data_structs/queue.rb
|
153
158
|
- lib/algorithmable/data_structs/stack.rb
|