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 }