package main
import (
"fmt"
"strconv"
"unicode"
)
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
func solve(s string) int {
s = "(" + s + ")"
var op []rune
var nums []int
for i := 0; i < len(s); i++ {
if unicode.IsNumber(rune(s[i])) {
pos := i
for pos < len(s) && unicode.IsNumber(rune(s[pos])) {
pos++
}
num, _ := strconv.Atoi(s[i:pos])
nums = append(nums, num)
i = pos - 1
} else {
if s[i] == ')' {
for len(op) > 0 && op[len(op)-1] != '(' {
a, b := nums[len(nums)-2], nums[len(nums)-1]
nums = nums[:len(nums)-2]
operate := op[len(op)-1]
op = op[:len(op)-1]
rst := figure(a, b, operate)
nums = append(nums, rst)
}
op = op[:len(op)-1]
} else {
for len(op) > 0 && check(op[len(op)-1], rune(s[i])) {
a, b := nums[len(nums)-2], nums[len(nums)-1]
nums = nums[:len(nums)-2]
operate := op[len(op)-1]
op = op[:len(op)-1]
rst := figure(a, b, operate)
nums = append(nums, rst)
}
op = append(op, rune(s[i]))
}
}
}
return nums[0]
}
func check(pre, cur rune) bool {
if pre == '(' || pre == ')' || cur == '(' || cur == ')' {
return false
}
if cur != '*' {
return true
} else if pre == '*' && cur == '*' {
return true
}
return false
}
func figure(a, b int, op rune) int {
switch op {
case '+':
return a + b
case '-':
return a - b
case '*':
return a * b
case '/':
return a / b
}
return 0
}