Skip to content

Commit b4200a6

Browse files
authored
Merge pull request #6 from sirwez/master
2 parents 22d50f2 + e710908 commit b4200a6

File tree

9 files changed

+880
-0
lines changed

9 files changed

+880
-0
lines changed

DataStructures/Hashset/Hashset.lua

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
local hashset = {}
2+
3+
hashset.__index = hashset
4+
5+
hashset.Node = {}
6+
hashset.Node.__index = hashset.Node
7+
8+
function hashset.Node.create(key)
9+
local s = {}
10+
setmetatable(s, hashset.Node)
11+
12+
s.key = key
13+
s.next = nil
14+
15+
return s
16+
end
17+
18+
function hashset.create(hash)
19+
local s = {}
20+
setmetatable(s, hashset)
21+
22+
if hash == nil then
23+
hash = function(x) return x end
24+
end
25+
26+
s.s = {}
27+
s.N = 0
28+
s.hash = hash
29+
30+
return s
31+
end
32+
33+
function hashset:add(key)
34+
local h = self.hash(key)
35+
local x = self.s[h]
36+
local found = false
37+
while x ~= nil do
38+
if x.key == key then
39+
found = true
40+
break
41+
end
42+
x = x.next
43+
end
44+
45+
if found == false then
46+
local old = self.s[h]
47+
self.s[h] = hashset.Node.create(key)
48+
self.s[h].next = old
49+
self.N = self.N + 1
50+
end
51+
52+
end
53+
54+
function hashset:contains(key)
55+
local h = self.hash(key)
56+
local x = self.s[h]
57+
while x ~= nil do
58+
if x.key == key then
59+
return true
60+
end
61+
x = x.next
62+
end
63+
return false
64+
end
65+
66+
function hashset:size()
67+
return self.N
68+
end
69+
70+
function hashset:isEmpty()
71+
return self.N == 0
72+
end
73+
74+
function hashset:remove(key)
75+
local h = self.hash(key)
76+
local x = self.s[h]
77+
local prev_x = nil
78+
while x ~= nil do
79+
if x.key == key then
80+
if prev_x == nil then
81+
self.s[h] = x.next
82+
else
83+
prev_x.next = x.next
84+
end
85+
self.N = self.N - 1
86+
end
87+
prev_x = x
88+
x = x.next
89+
end
90+
91+
return nil
92+
end
93+
94+
return hashset

DataStructures/List/List.lua

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
local list = {}
2+
3+
list.ArrayList = {}
4+
list.ArrayList.__index = list.ArrayList
5+
6+
function list.ArrayList.create()
7+
local s = {}
8+
setmetatable(s, list.ArrayList)
9+
10+
s.a = { nil }
11+
s.aLen = 1
12+
s.N = 0
13+
return s
14+
end
15+
16+
function list.ArrayList.createWith(a, aLen, N)
17+
local s = {}
18+
setmetatable(s, list.ArrayList)
19+
20+
s.a = a
21+
s.aLen = aLen
22+
s.N = N
23+
return s
24+
end
25+
26+
function list.create()
27+
return list.ArrayList.create()
28+
end
29+
30+
function list.createWith(a, aLen, N)
31+
return list.ArrayList.createWith(a, aLen, N)
32+
end
33+
34+
function list.ArrayList:makeCopy()
35+
local temp = {}
36+
for key,val in pairs(self.a) do
37+
temp[key] = val
38+
end
39+
return list.ArrayList.createWith(temp, self.aLen, self.N)
40+
end
41+
42+
function list.ArrayList:add(value)
43+
self.a[self.N] = value
44+
self.N = self.N + 1
45+
if self.N == self.aLen then
46+
self:resize(self.aLen * 2)
47+
end
48+
end
49+
50+
function list.ArrayList:set(index,value)
51+
self.a[index] = value
52+
end
53+
54+
function list.ArrayList:get(index)
55+
local temp = self.a[index]
56+
return temp
57+
end
58+
59+
function list.ArrayList:removeAt(index)
60+
if index == self.N-1 then
61+
self.N = self.N - 1
62+
return
63+
end
64+
for i = index+1,self.N-1 do
65+
self.a[i-1]=self.a[i]
66+
end
67+
self.N = self.N - 1
68+
if self.N == math.floor(self.aLen / 4) then
69+
self:resize(math.floor(self.aLen / 2))
70+
end
71+
72+
end
73+
74+
function list.ArrayList:indexOf(value)
75+
if self.N == 0 then
76+
return -1
77+
end
78+
for i=0,self.N-1 do
79+
if self.a[i] == value then
80+
return i
81+
end
82+
end
83+
return -1
84+
end
85+
86+
function list.ArrayList:remove(value)
87+
local index = self:indexOf(value)
88+
self:removeAt(index)
89+
end
90+
91+
function list.ArrayList:resize(newSize)
92+
local temp = {}
93+
for i = 0,(newSize-1) do
94+
temp[i] = self.a[i]
95+
end
96+
97+
self.a = temp
98+
self.aLen = newSize
99+
end
100+
101+
function list.ArrayList:size()
102+
return self.N
103+
end
104+
105+
function list.ArrayList:isEmpty()
106+
return self.N == 0
107+
end
108+
109+
function list.ArrayList:enumerate()
110+
local temp = {}
111+
for i = 0,(self.N-1) do
112+
temp[i] = self.a[i]
113+
end
114+
return temp
115+
end
116+
117+
function list.ArrayList:isSortedAscendingly(comparator)
118+
for i=0,(self:size()-2) do
119+
if comparator(a:get(i), a:get(i+1)) > 0 then
120+
return false
121+
end
122+
123+
end
124+
return true
125+
end
126+
127+
function list.ArrayList:isSortedDescendingly(comparator)
128+
for i=0,(self:size()-2) do
129+
if comparator(a:get(i), a:get(i+1)) < 0 then
130+
return false
131+
end
132+
133+
end
134+
return true
135+
end
136+
137+
return list

DataStructures/Queue/Queue.lua

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
local queue = {}
2+
3+
queue.LinkedListQueue = {}
4+
queue.LinkedListQueue.__index = queue.LinkedListQueue
5+
6+
queue.Node = {}
7+
queue.Node.__index = queue.Node
8+
9+
function queue.Node.create(value)
10+
local s = {}
11+
setmetatable(s, queue.Node)
12+
13+
s.value = value
14+
s.next = nil
15+
16+
return s
17+
end
18+
19+
function queue.LinkedListQueue.create()
20+
local s = {}
21+
setmetatable(s, queue.LinkedListQueue)
22+
23+
s.first = nil
24+
s.last = nil
25+
s.N = 0
26+
27+
return s
28+
end
29+
30+
function queue.create()
31+
return queue.LinkedListQueue.create()
32+
end
33+
34+
function queue.LinkedListQueue:enqueue(value)
35+
local oldLast = self.last
36+
self.last = queue.Node.create(value)
37+
if oldLast ~= nil then
38+
oldLast.next = self.last
39+
end
40+
if self.first == nil then
41+
self.first = self.last
42+
end
43+
self.N = self.N + 1
44+
end
45+
46+
function queue.LinkedListQueue:dequeue()
47+
local oldFirst = self.first
48+
if oldFirst == nil then
49+
return nil
50+
end
51+
self.first = oldFirst.next
52+
local value = oldFirst.value
53+
if self.first == nil then
54+
self.last = nil
55+
end
56+
self.N = self.N - 1
57+
return value
58+
end
59+
60+
function queue.LinkedListQueue:size()
61+
return self.N
62+
end
63+
64+
function queue.LinkedListQueue:isEmpty()
65+
return self.N == 0
66+
end
67+
68+
function queue.LinkedListQueue:enumerate()
69+
local index = 0
70+
local temp = {}
71+
local x = self.first
72+
while x ~= nil do
73+
local value = x.value
74+
temp[index] = value
75+
index = index + 1
76+
x = x.next
77+
end
78+
79+
return temp
80+
81+
end
82+
83+
queue.ArrayQueue = {}
84+
queue.ArrayQueue.__index = queue.ArrayQueue
85+
86+
function queue.ArrayQueue.create()
87+
local s = {}
88+
setmetatable(s, queue.ArrayQueue)
89+
90+
s.head = 0
91+
s.tail = 0
92+
s.a = { nil }
93+
s.aLen = 0
94+
95+
return s
96+
end
97+
98+
function queue.ArrayQueue:enqueue(value)
99+
self.a[self.tail] = value
100+
self.tail = self.tail + 1
101+
if self.tail - self.head == self.aLen then
102+
self:resize(self.aLen * 2)
103+
end
104+
105+
end
106+
107+
function queue.ArrayQueue:size()
108+
return self.tail - self.head
109+
end
110+
111+
function queue.ArrayQueue:isEmpty()
112+
return self.tail == self.head
113+
end
114+
115+
function queue.ArrayQueue:dequeue(value)
116+
if self.tail == self.head then
117+
return nil
118+
end
119+
120+
value = self.a[self.head]
121+
self.head = self.head + 1
122+
if self.tail - self.head == math.floor(self.aLen / 4) then
123+
self:resize(math.floor(self.aLen / 2))
124+
end
125+
126+
return value
127+
end
128+
129+
function queue.ArrayQueue:resize(newSize)
130+
local temp = {}
131+
for i = 0,(newSize-1) do
132+
if i < self.tail - self.head then
133+
temp[i] = nil
134+
else
135+
temp[i] = self.a[i + self.head]
136+
end
137+
end
138+
139+
self.a = temp
140+
self.aLen = newSize
141+
self.tail = self.tail - self.head
142+
self.head = 0
143+
end
144+
145+
function queue.ArrayQueue:enumerate()
146+
local temp = {}
147+
for i = self.head,self.tail-1 do
148+
temp[i - self.head] = self.a[i]
149+
end
150+
return temp
151+
end
152+
153+
return queue

0 commit comments

Comments
 (0)