ruby_structures 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3010a5b7d4654d61386dc05018e491f62c5bd0aa
4
+ data.tar.gz: 7e9bab4d78a0ba383eec40ba4600d5429eaab75f
5
+ SHA512:
6
+ metadata.gz: 1faeaa2b732a4d0f05939c7e92bff5bb81d90e7941ebf6c00fc29e26157efcb848fc3bea643a92c785f4e6f5e7ef374bb915802de0e53bbae8d84d4144948ea0
7
+ data.tar.gz: f4a2e6d6885b2c5bc165cd7817913f94e677eddb69eec6bccee072403d0250d0728703ae2df24c415104fbea3b0bd18f889df2bef608d529983deb1f6c358b9d
@@ -0,0 +1,131 @@
1
+ class LinkedList
2
+ include Enumerable
3
+
4
+ def initialize(head=nil, tail=nil)
5
+ @head = Node.new
6
+ @tail = Node.new
7
+ @head.send(:next=, @tail)
8
+ @tail.send(:prev=, @head)
9
+ end
10
+
11
+ def to_a
12
+ self.reduce([]) {|arr, n| arr << n.send(:val)}
13
+ end
14
+
15
+ def to_s
16
+ return "LinkedList is empty" if self.empty?
17
+
18
+ vals = self.map { |n| n.send(:val) }
19
+ vals.join(' -> ')
20
+ end
21
+
22
+ def inspect
23
+ return "LinkedList is empty" if self.empty?
24
+
25
+ vals = self.map { |n| n.send(:val) }
26
+ vals.join(' -> ')
27
+ end
28
+
29
+ def empty?
30
+ @head.send(:next) == @tail
31
+ end
32
+
33
+ def first
34
+ first = @head.send(:next)
35
+ first == @tail ? nil : first
36
+ end
37
+
38
+ def last
39
+ last = @tail.send(:prev)
40
+ last == @head ? nil : last
41
+ end
42
+
43
+ def append(val=nil)
44
+ node = Node.new(val)
45
+ last = @tail.send(:prev)
46
+
47
+ last.send(:next=, node)
48
+ @tail.send(:prev=, node)
49
+
50
+ node.send(:prev=, last)
51
+ node.send(:next=, @tail)
52
+
53
+ node
54
+ end
55
+
56
+ def prepend(val=nil)
57
+ node = Node.new(val)
58
+ first = @head.send(:next)
59
+
60
+ first.send(:prev=, node)
61
+ @head.send(:next=, node)
62
+
63
+ node.send(:prev=, @head)
64
+ node.send(:next=, first)
65
+
66
+ node
67
+ end
68
+
69
+ def find(val)
70
+ self.each { |n| return node if n.send(:val) == val }
71
+ nil
72
+ end
73
+
74
+ def include(val)
75
+ self.each { |n| return true if n.send(:val) == val }
76
+ false
77
+ end
78
+
79
+ def remove(val)
80
+ node = self.find(val)
81
+ return nil if node.nil?
82
+
83
+ prev_node = node.send(:prev)
84
+ next_node = node.send(:next)
85
+
86
+ prev_node.send(:next=, next_node)
87
+ next_node.send(:prev=, prev_node)
88
+
89
+ node
90
+ end
91
+
92
+ def update(old_val, new_val)
93
+ node = self.find(old_val)
94
+ raise ArgumentError.new("Couldn't find Node with value=#{old_val}") if node.nil?
95
+
96
+ node.send(:val=, new_val)
97
+ node
98
+ end
99
+
100
+ def each(&prc)
101
+ current_node = @head.send(:next)
102
+ return self if current_node.nil?
103
+
104
+ while current_node != @tail
105
+ prc.call(current_node)
106
+ current_node = current_node.send(:next)
107
+ end
108
+
109
+ self
110
+ end
111
+ end
112
+
113
+ class Node
114
+ def initialize(val=nil, next_node=nil, prev_node=nil)
115
+ @val = val
116
+ @next = next_node
117
+ @prev = prev_node
118
+ end
119
+
120
+ def to_s
121
+ val
122
+ end
123
+
124
+ def inspect
125
+ val
126
+ end
127
+
128
+ private
129
+
130
+ attr_accessor :val, :next, :prev
131
+ end
@@ -0,0 +1,53 @@
1
+ class Queue
2
+ def initialize
3
+ @store = Array.new
4
+ end
5
+
6
+ def to_a
7
+ Array.new(@store)
8
+ end
9
+
10
+ def to_s
11
+ @store
12
+ end
13
+
14
+ def inspect
15
+ @store
16
+ end
17
+
18
+ def ==(other_queue)
19
+ @store == other_queue.send(:store)
20
+ end
21
+
22
+ def empty?
23
+ @store.empty?
24
+ end
25
+
26
+ def enqueue(el)
27
+ @store.push(el)
28
+ end
29
+
30
+ def <<(el)
31
+ @store << el
32
+ end
33
+
34
+ def dequeue
35
+ @store.shift
36
+ end
37
+
38
+ def peek
39
+ @store.first
40
+ end
41
+
42
+ def length
43
+ @store.length
44
+ end
45
+
46
+ def include?(el)
47
+ @store.include?(el)
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :store
53
+ end
@@ -0,0 +1,53 @@
1
+ class Stack
2
+ def initialize
3
+ @store = Array.new
4
+ end
5
+
6
+ def to_a
7
+ Array.new(@store)
8
+ end
9
+
10
+ def to_s
11
+ @store
12
+ end
13
+
14
+ def inspect
15
+ @store
16
+ end
17
+
18
+ def ==(other_stack)
19
+ @store == other_stack.send(:store)
20
+ end
21
+
22
+ def empty?
23
+ @store.empty?
24
+ end
25
+
26
+ def push(el)
27
+ @store.push(el)
28
+ end
29
+
30
+ def <<(el)
31
+ @store << el
32
+ end
33
+
34
+ def pop
35
+ @store.pop
36
+ end
37
+
38
+ def peek
39
+ @store.last
40
+ end
41
+
42
+ def length
43
+ @store.length
44
+ end
45
+
46
+ def include?(el)
47
+ @store.include?(el)
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :store
53
+ end
@@ -0,0 +1,3 @@
1
+ require 'data_structures/stack'
2
+ require 'data_structures/queue'
3
+ require 'data_structures/linked_list'
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_structures
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jason Numeroff
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-05-07 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Ruby implementations of a Stack, Queue and Linked List. More to come!
14
+ email: jnumeroff@hotmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/data_structures/linked_list.rb
20
+ - lib/data_structures/queue.rb
21
+ - lib/data_structures/stack.rb
22
+ - lib/ruby_structures.rb
23
+ homepage: https://github.com/Numie/DataStructures
24
+ licenses:
25
+ - MIT
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 2.5.1
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: Ruby Data Structures
47
+ test_files: []