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
| func calculate(s string) int { s = strings.ReplaceAll(s, " ", "") stk := make([]rune, 0) for _, v := range s { if v != ')' { stk = append(stk, v) continue }
var bf bytes.Buffer for { top := stk[len(stk)-1] stk = stk[:len(stk)-1] if top == '(' { break } bf.WriteRune(top) }
val := simpleCalculate(reverse(bf.String())) for _, vv := range val { stk = append(stk, vv) } } ans, err := strconv.Atoi(simpleCalculate(string(stk))) if err != nil { panic(err) } return ans }
func simpleCalculate(expr string) string { expr = strings.ReplaceAll(expr, "--", "+") expr = strings.ReplaceAll(expr, "+-", "-")
stk := make([]int, 0) num := 0 opt := '+'
for i, v := range expr { if unicode.IsDigit(v) { num = num*10 + int(v-'0') } if isOpt(v) || i == len(expr)-1 { switch opt { case '+': stk = append(stk, num) case '-': stk = append(stk, -num) } num = 0 opt = v } } return strconv.Itoa(sum(stk)) }
func isOpt(ch rune) bool { opts := "+-*/" return strings.Contains(opts, string(ch)) }
func sum(nums []int) int { ans := 0 for _, v := range nums { ans += v } return ans }
func reverse(s string) string { runes := []rune(s) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = runes[j], runes[i] } return string(runes) }
|