Parsing/RPN calculator algorithm: Difference between revisions

(Updated to work with Nim 1.4: added missing parameter type and done other changes.)
Line 5,171:
=={{header|Vlang}}==
{{trans|C}}
Updated to Vlang version 0.2.2
<lang vlanggo>import math
 
const (
SupportedOperationssupported_operations = ['+', '-', '*', '/', '^']
MaxDepthmax_depth = 256
)
 
struct Stack {
mut:
data []f32 = [f32(0)].repeat(MaxDepthmax_depth)
depth int=0
}
 
fn (s mut stack Stack) push(vvalue f32) {
if sstack.depth >= MaxDepthmax_depth {
println('Stack Overflow!!')
return
}
}
s stack.data[sstack.depth] = vvalue
s stack.depth++
}
 
fn (s mut stack Stack) pop() ?f32 {
if sstack.depth > 0 {
s stack.depth--
result := sstack.data[sstack.depth]
return result
}
}
return error('Stack Underflow!!')
}
 
fn (sstack Stack) peek() ?f32 {
if sstack.depth > 0 {
result := sstack.data[0]
return result
}
}
return error('Out of Bounds...')
}
 
fn (s mut stack Stack) rpn(input string) ?f32 {
println('Input: $input')
tokens := input.split(' ')
mut a := f32(0)
mut b := f32(0)
println('Token Stack')
for token in tokens {
if token.str.is_digit() {
s stack.push(token.f32())
} else if token in supported_operations {
}
b = stack.pop() or { f32(0) }
else if token in SupportedOperations {
b a = sstack.pop() or { f32(0) }
match token {
f32(0)
'+' {
}
stack.push(a + b)
a = s.pop() or {
}
f32(0)
'-' {
}
stack.push(a - b)
match token {
}
'+' {
'*' {
s.push(a + b)
stack.push(a * b)
}
}
'-' {
'/' {
s.push(a - b)
stack.push(a / b)
}
}
'*' {
'^' {
s.push(a * b)
stack.push(f32(math.pow(a, b)))
}
}
'/' {
else {
s.push(a / b)
println('Oofffff')
}
}
'^' {
}
s.push(math.pow(a,b))
}
}
print('${token:5s} ')
else {
for i := 0; i < sstack.depth; i++ {
println('Oofffff')
if i == sstack.depth - 1 {
}
println('${sstack.data[i] : 0.6f} |>')
}
} else {
}
print('${token stack.data[i]: 5s0.6f} , ')
}
for i := 0; i < s.depth; i++{
}
if i == s.depth - 1 {
}
println('${s.data[i] : 0.6f} |>')
return sstack.peek()
}
else {
print('${s.data[i] : 0.6f}, ')
}
}
}
return s.peek()
}
 
fn main() {
mut calc := Stack{}
result := calc.rpn('3 4 2 * 1 5 - 2 3 ^ ^ / +') or { return }
println('\nResult: $result')
return
}
}
}</lang>
println('\nResult: $result')
}</lang>
{{out}}
<pre>Input: 3 4 2 * 1 5 - 2 3 ^ ^ / +
Anonymous user