-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstack.lala
129 lines (98 loc) · 2.85 KB
/
stack.lala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
structure IntStack {
size: int
capacity: int
values: [int]
}
function assert-int-stack(var stack: IntStack): void {
if stack.capacity < 0 {
print 'Error: stack capacity is less than 0'
}
if stack.size < 0 {
print 'Error: stack size is less than 0'
}
if stack.capacity > stack.size {
print (
'Error: stack capacity (' +
stack.capacity: string +
') is greater than stack size (' +
stack.size: string +
')'
)
}
}
function create-int-stack(): IntStack
return IntStack(0, 0, [])
function resize-int-stack(var stack: IntStack, var new-capacity: int): void {
assert-int-stack(stack)
if new-capacity < 8 {
print 'Error: trying to resize a stack to ' + new-capacity: string + ' < 8 elements'
return
}
if new-capacity == stack.capacity {
print 'Error: trying to resize a stack to the same capacity as it already is'
return
}
var new-values: [int] = [0] * new-capacity
var n: int = new-capacity
if stack.size < new-capacity
n = stack.size
var i: int = 0
while i < n {
new-values[i] = stack.values[i]
i = i + 1
}
stack.values = new-values
assert-int-stack(stack)
}
function grow-int-stack(var stack: IntStack): void {
if stack.capacity < 8
resize-int-stack(stack, 8)
else
resize-int-stack(stack, stack.capacity * 2)
}
function shrink-int-stack(var stack: IntStack): void {
resize-int-stack(stack, stack.capacity / 2)
}
function shrink-int-stack-if-needed(var stack: IntStack): void {
if stack.capacity / 2 >= 8 and stack.size * 4 < stack.capacity
shrink-int-stack(stack)
}
function push-onto-int-stack(var stack: IntStack, var value: int): void {
assert-int-stack(stack)
if stack.capacity == stack.size
grow-int-stack(stack)
stack.values[stack.size] = value
stack.size = stack.size + 1
assert-int-stack(stack)
}
function pop-from-int-stack(var stack: IntStack): int {
assert-int-stack(stack)
if stack.size == 0 {
print 'Error: trying to pop a value from an empty stack.'
return 0
}
var value: int = stack.values[stack.size - 1]
stack.size = stack.size - 1
shrink-int-stack-if-needed(stack)
assert-int-stack(stack)
return value
}
function clear-int-stack(var stack: IntStack): void {
assert-int-stack(stack)
stack.size = 0
shrink-int-stack-if-needed(stack)
assert-int-stack(stack)
}
function int-stack-to-string(var stack: IntStack): string {
assert-int-stack(stack)
var str: string = '['
var i: int = 0
while i < stack.size {
str = str + stack.values[i]: string
if i < stack.size - 1
str = str + ' '
i = i + 1
}
str = str + ']'
return str
}