1+ package main
2+
3+ import (
4+ "fmt"
5+ "strconv"
6+ "strings"
7+ )
8+
9+ func Calculate (input string ) (float64 , error ) {
10+ result := 0.0
11+
12+ if len (input ) < 1 {
13+ return result , nil
14+ }
15+
16+ splitted := strings .Split (input , " " )
17+
18+ if isNumeric (splitted [len (splitted )- 1 ]) {
19+ return strconv .ParseFloat (splitted [len (splitted )- 1 ], 64 )
20+ }
21+
22+ var numbers []string
23+ validOperations := []string {"+" , "-" , "*" , "/" }
24+
25+ for _ , element := range splitted {
26+ if ! IsValidElement (element , validOperations ) {
27+ return - 1 , fmt .Errorf ("invalid syntax" )
28+ }
29+
30+ if isNumeric (element ) {
31+ numbers = append (numbers , element )
32+ } else {
33+ number1 , numbers := numbers [len (numbers )- 1 ], numbers [:len (numbers )- 1 ]
34+ number2 , numbers := numbers [len (numbers )- 1 ], numbers [:len (numbers )- 1 ]
35+
36+ op1 , _ := strconv .ParseFloat (number1 , 64 )
37+ op2 , _ := strconv .ParseFloat (number2 , 64 )
38+
39+ switch element {
40+ case "+" :
41+ result = op2 + op1
42+ case "-" :
43+ result = op2 - op1
44+ case "*" :
45+ result = op2 * op1
46+ case "/" :
47+ result = op2 / op1
48+ }
49+
50+ numbers = append (numbers , strconv .FormatFloat (result , 'E' , - 1 , 64 ))
51+ }
52+
53+
54+ }
55+
56+ return result , nil
57+ }
58+
59+ func Find (slice []string , val string ) (int , error ) {
60+ for i , item := range slice {
61+ if item == val {
62+ return i , nil
63+ }
64+ }
65+ return - 1 , fmt .Errorf ("cannot find element '%s'" , val )
66+ }
67+
68+ func isNumeric (s string ) bool {
69+ _ , err := strconv .ParseFloat (s , 64 )
70+ return err == nil
71+ }
72+
73+ func IsValidElement (element string , validOperations []string ) bool {
74+ _ , err := Find (validOperations , element )
75+ if ! isNumeric (element ) && err != nil {
76+ return false
77+ }
78+
79+ return true
80+ }
81+
82+ func main () {
83+ r , _ := Calculate ("6 3 /" )
84+
85+ fmt .Printf ("ergebnis: %v" , r )
86+ }
0 commit comments