adt_utilit 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b6af6922d287bcf52954bdaf9ba808109883652e
4
- data.tar.gz: 3ced982a4a11dc086b532390cb855dd32abde1d6
3
+ metadata.gz: 5e8ee1f39f314d0f7ca04f595bd4b474d361aa2f
4
+ data.tar.gz: 9e26d7ba45ad54ddb0bff7b5f4860e146957a415
5
5
  SHA512:
6
- metadata.gz: 4c8380a9e31dbf75bdf91f8444e36c650bcfa9fd1f55c7a17047ed9d0197d986399b2174140462341a05cfe3a99da5fd92c8477d5f3ede8845910b622173d70a
7
- data.tar.gz: 36d70d84e451c2e4f022523d1c6371f92a3b6cbb08289ef56ee3f625c77b2790acf1ffc9d9fafe46b6b054f6edca87a9fcf5a0889f786d1b6e92cbbd786f8f46
6
+ metadata.gz: e13664fee3e3cfcf5b2587d966accf1f2c7ab520d921109a161fae1f57098a2c57b1389c6a35994866713f10955890497afab20353b547f15030dcadc7a47a3f
7
+ data.tar.gz: cf2dfcd78512d7de2110ab393c3acb621a5d97b97deb12baa38d27c57af897c8e26bf3da5e9a8ad1f8290369855ef25ca8e86ea635e9641784ef74d39f798880
@@ -1,14 +1,13 @@
1
1
  require_relative 'linked_list_node.rb'
2
- require "byebug"
3
2
  class LinkedList
4
3
  include Enumerable
5
4
  attr_reader :length, :head, :tail
6
5
 
7
- def initialize(value)
8
- if value.is_a?(Array)
6
+ def initialize(value = nil)
7
+ if value.nil?
8
+ nodes = []
9
+ elsif value.is_a?(Array)
9
10
  nodes = initialize_with_array(value)
10
- elsif value.is_a?(Hash)
11
- nodes = initialize_with_hash(value)
12
11
  else
13
12
  nodes = [LinkedListNode.new(value)]
14
13
  end
@@ -52,8 +51,14 @@ class LinkedList
52
51
  else
53
52
  node = LinkedListNode.new(value)
54
53
  end
55
- @tail.connect(node)
56
- @tail = node
54
+
55
+ if @length == 0
56
+ @head = @tail = node
57
+ else
58
+ @tail.connect(node)
59
+ @tail = node
60
+ end
61
+
57
62
  @length +=1
58
63
  self
59
64
  end
@@ -64,8 +69,14 @@ class LinkedList
64
69
  else
65
70
  node = LinkedListNode.new(value)
66
71
  end
67
- node.connect(@head)
68
- @head = node
72
+
73
+ if @length == 0
74
+ @head = @tail = node
75
+ else
76
+ node.connect(@head)
77
+ @head = node
78
+ end
79
+
69
80
  @length +=1
70
81
  self
71
82
  end
@@ -84,7 +95,7 @@ class LinkedList
84
95
  shifted_node
85
96
  end
86
97
 
87
- def find(value)
98
+ def find_node(value)
88
99
  self.each do |node|
89
100
  return node if node.value == value
90
101
  end
@@ -148,14 +159,4 @@ class LinkedList
148
159
  nodes
149
160
  end
150
161
 
151
- def initialize_with_hash(hash)
152
- nodes = []
153
- hash.map do |key, value|
154
- node = LinkedListNode.new({key => value})
155
- nodes[-1].connect(node) unless nodes[-1].nil?
156
- nodes << node
157
- end
158
- nodes
159
- end
160
-
161
162
  end
@@ -0,0 +1,37 @@
1
+ class Queue
2
+ include Enumerable
3
+ def initialize(value = nil)
4
+ if value.nil?
5
+ @queue = []
6
+ elsif value.is_a?(Array)
7
+ @queue = value
8
+ else
9
+ @queue = [value]
10
+ end
11
+ end
12
+
13
+ def each(&prc)
14
+ @queue.each(&prc)
15
+ end
16
+
17
+ def length
18
+ @queue.length
19
+ end
20
+
21
+ def enqueue(value)
22
+ @queue.push(value)
23
+ end
24
+
25
+ def dequeue
26
+ @queue.shift
27
+ end
28
+
29
+ def peek
30
+ @queue.first
31
+ end
32
+
33
+ def last
34
+ @queue.last
35
+ end
36
+
37
+ end
@@ -0,0 +1,105 @@
1
+ class Stack
2
+ include Enumerable
3
+ def initialize(value = nil)
4
+ @stack = []
5
+ if value.nil?
6
+ return
7
+ elsif value.is_a?(Array)
8
+ value.each do |el|
9
+ push(el)
10
+ end
11
+ else
12
+ push(value)
13
+ end
14
+ end
15
+
16
+ def self.new_with_metadata(metadata_name, &prc)
17
+ stack = self.new
18
+ stack.instance_variable_set(:@metadata, {max: "#{metadata_name}_max", min: "#{metadata_name}_min", proc: prc})
19
+
20
+ define_method("#{metadata_name}_max"){
21
+ raise "such metadata has not been set for this instance" if @metadata.nil?
22
+ return nil if @stack.empty?
23
+ @stack.last[@metadata[:max]]
24
+ }
25
+ define_method("#{metadata_name}_min"){
26
+ raise "such metadata has not been set for this instance" if @metadata.nil?
27
+ return nil if @stack.empty?
28
+ @stack.last[@metadata[:min]]
29
+ }
30
+ stack
31
+ end
32
+
33
+ def peek
34
+ return nil if @stack.empty?
35
+ @stack.last[:value]
36
+ end
37
+
38
+ def min
39
+ return nil if @stack.empty?
40
+ @stack.last[:min]
41
+ end
42
+
43
+ def max
44
+ return nil if @stack.empty?
45
+ @stack.last[:max]
46
+ end
47
+
48
+ def length
49
+ @stack.length
50
+ end
51
+
52
+ def empty?
53
+ @stack.length == 0
54
+ end
55
+
56
+ def push(value)
57
+ stack_el = {value: value}
58
+ if @stack.empty?
59
+ stack_el[:max] = stack_el[:min] = stack_el[:value]
60
+ unless @metadata.nil?
61
+ stack_el[@metadata[:max]] = stack_el[@metadata[:min]] = stack_el[:value]
62
+ end
63
+ else
64
+ stack_el[:max] = stack_el[:value] >= max ? stack_el[:value] : max
65
+ stack_el[:min] = stack_el[:value] <= min ? stack_el[:value] : min
66
+ if @metadata
67
+ proc = @metadata[:proc]
68
+
69
+ if proc.call(stack_el[:value]) >= proc.call(self.send("#{@metadata[:max]}"))
70
+ stack_el[@metadata[:max]] = stack_el[:value]
71
+ else
72
+ stack_el[@metadata[:max]] = self.send("#{@metadata[:max]}")
73
+ end
74
+
75
+ if proc.call(stack_el[:value]) <= proc.call(self.send("#{@metadata[:min]}"))
76
+ stack_el[@metadata[:min]] = stack_el[:value]
77
+ else
78
+ stack_el[@metadata[:min]] = self.send("#{@metadata[:min]}")
79
+ end
80
+ end
81
+ end
82
+ @stack << stack_el
83
+ self
84
+ end
85
+
86
+ def pop
87
+ return nil if @stack.empty?
88
+ top_el = @stack.pop
89
+ top_el[:value]
90
+ end
91
+
92
+ def each(&prc)
93
+ @stack.each do |el|
94
+ prc.call(el[:value])
95
+ end
96
+ end
97
+
98
+ def each_from_top(&prc)
99
+ (@stack.length - 1).downto(0) do |i|
100
+ prc.call(@stack[i][:value])
101
+ end
102
+ self
103
+ end
104
+
105
+ end
@@ -0,0 +1,121 @@
1
+ require_relative "queue"
2
+ require_relative "stack"
3
+ class StackQueue
4
+ include Enumerable
5
+ def initialize(value = nil)
6
+ @stack_a = Stack.new
7
+ @stack_b = Stack.new
8
+ if !value.nil?
9
+ if value.is_a?(Array)
10
+ value.each { |el| @stack_a.push(el) }
11
+ else
12
+ @stack_a.push(value)
13
+ end
14
+ end
15
+ end
16
+
17
+ def peek
18
+ slinky if @stack_b.empty?
19
+ @stack_b.peek
20
+ end
21
+
22
+ def last
23
+ if @stack_a.empty?
24
+ @stack_b_bottom
25
+ else
26
+ @stack_a.peek
27
+ end
28
+ end
29
+
30
+ def enqueue(value)
31
+ @stack_a.push(value)
32
+ end
33
+
34
+ def dequeue
35
+ return nil if self.empty?
36
+ slinky if @stack_b.empty?
37
+ @stack_b.pop
38
+ end
39
+
40
+ def min
41
+ return nil if self.empty?
42
+ return @stack_a.min if @stack_b.min.nil?
43
+ return @stack_b.min if @stack_a.min.nil?
44
+ [@stack_a.min, @stack_b.min].min
45
+ end
46
+
47
+ def max
48
+ return nil if self.empty?
49
+ return @stack_a.max if @stack_b.max.nil?
50
+ return @stack_b.max if @stack_a.max.nil?
51
+ [@stack_a.max, @stack_b.max].max
52
+ end
53
+
54
+ def length
55
+ @stack_a.length + @stack_b.length
56
+ end
57
+
58
+ def empty?
59
+ @stack_a.empty? && @stack_b.empty?
60
+ end
61
+
62
+ def self.new_with_metadata(metadata_name, &prc)
63
+ stack_queue = self.new
64
+ stack_queue.instance_variable_set(:@metadata, {
65
+ max: "#{metadata_name}_max",
66
+ min: "#{metadata_name}_min",
67
+ proc: prc
68
+ })
69
+ stack_queue.instance_variable_set(:@stack_a, Stack.new_with_metadata(metadata_name, &prc))
70
+ stack_queue.instance_variable_set(:@stack_b, Stack.new_with_metadata(metadata_name, &prc))
71
+
72
+ define_method("#{metadata_name}_max") {
73
+ raise "such metadata has not been set for this instance" if @metadata.nil?
74
+ return nil if self.empty?
75
+ prc = @metadata[:proc]
76
+ stack_a_max = @stack_a.send(@metadata[:max])
77
+ stack_b_max = @stack_b.send(@metadata[:max])
78
+
79
+ return stack_b_max if stack_a_max.nil?
80
+ return stack_a_max if stack_b_max.nil?
81
+ if prc.call(stack_a_max) < prc.call(stack_b_max)
82
+ return stack_b_max
83
+ else
84
+ return stack_a_max
85
+ end
86
+ }
87
+
88
+ define_method("#{metadata_name}_min"){
89
+ raise "such metadata has not been set for this instance" if @metadata.nil?
90
+ return nil if self.empty?
91
+ prc = @metadata[:proc]
92
+ stack_a_min = @stack_a.send(@metadata[:min])
93
+ stack_b_min = @stack_b.send(@metadata[:min])
94
+
95
+ return stack_b_min if stack_a_min.nil?
96
+ return stack_a_min if stack_b_min.nil?
97
+ if prc.call(stack_a_min) < prc.call(stack_b_min)
98
+ return stack_b_min
99
+ else
100
+ return stack_a_min
101
+ end
102
+ }
103
+
104
+ return stack_queue
105
+ end
106
+
107
+ def each(&prc)
108
+ @stack_b.each_from_top(&prc)
109
+ @stack_a.each(&prc)
110
+ self
111
+ end
112
+
113
+ private
114
+ def slinky
115
+ if @stack_b.empty?
116
+ @stack_b_bottom = @stack_a.peek
117
+ @stack_b.push(@stack_a.pop) until @stack_a.empty?
118
+ end
119
+ end
120
+
121
+ end
data/lib/adt_utilit.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'adt_utilit/linked_list'
2
+ require 'adt_utilit/stack_queue'
2
3
 
3
4
  class AdtUtilit
4
5
 
metadata CHANGED
@@ -1,16 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adt_utilit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirosvk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-19 00:00:00.000000000 Z
11
+ date: 2016-07-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: still in development
13
+ description: "<in development> AdtUtilit is a Ruby gem that provides a set of useful
14
+ data type classes such as Linked List, Queue, Stack, StackQueue, and Polytree. Many
15
+ intuitive methods are available for each class. See documentations for the details."
14
16
  email: kajino.hiroyuki@gmail.com
15
17
  executables: []
16
18
  extensions: []
@@ -19,6 +21,9 @@ files:
19
21
  - lib/adt_utilit.rb
20
22
  - lib/adt_utilit/linked_list.rb
21
23
  - lib/adt_utilit/linked_list_node.rb
24
+ - lib/adt_utilit/queue.rb
25
+ - lib/adt_utilit/stack.rb
26
+ - lib/adt_utilit/stack_queue.rb
22
27
  homepage: http://rubygems.org/gems/adt_utilit
23
28
  licenses:
24
29
  - MIT