-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
84 lines (70 loc) · 1.37 KB
/
main.go
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
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
fmt.Println(calculate("1+2*5/3+6/4*2"))
}
func calculate(s string) int {
s = strings.Replace(s, " ", "", -1)
var (
stack = make([]string, 0, len(s))
next string
)
result, start := getNextNum(s, 0)
stack = append(stack, result)
for i := start + 1; i < len(s); i++ {
ind := i
next, i = getNextNum(s, i+1)
switch s[ind] {
case '+':
stack = append(stack, "+")
stack = append(stack, next)
case '-':
stack = append(stack, "-")
stack = append(stack, next)
case '*':
last := stack[len(stack)-1]
stack = stack[:len(stack)-1]
val1, _ := strconv.Atoi(last)
val2, _ := strconv.Atoi(next)
stack = append(stack, fmt.Sprint(val1*val2))
case '/':
last := stack[len(stack)-1]
stack = stack[:len(stack)-1]
val1, _ := strconv.Atoi(last)
val2, _ := strconv.Atoi(next)
stack = append(stack, fmt.Sprint(val1/val2))
}
}
val, _ := strconv.Atoi(stack[0])
stack = stack[1:]
for len(stack) > 1 {
val2, _ := strconv.Atoi(stack[1])
op := stack[0]
stack = stack[2:]
if op == "+" {
val += val2
} else {
val -= val2
}
}
return val
}
func getNextNum(s string, pos int) (string, int) {
var (
num string
ind int
)
for i := pos; i < len(s); i++ {
if s[i] >= '0' && s[i] <= '9' {
num += string(s[i])
ind = i
continue
}
break
}
return num, ind
}