package main import ( "fmt" "strconv" ) type node struct { NType byte // 类型 0 数字 别的符号 Val int // } func main() { var s string fmt.Scanln(&s) var data []node var num []byte for i := 0; i < len(s); i++ { // 先把数字(包括负数)、符号、括号 解析出来 if s[i] == '-' && (i==0 || (i>0 && s[i-1] == '(') ) { num = append(num, '-') // 负数的情况,暂存负号 continue } else if '0' <= s[i] && s[i] <= '9' { num = append(num, s[i]) // 数字的情况,暂存数字 continue } if len(num) > 0 { // 各种符号的情况 data = append(data, node{0, bsToNum(num)}) // 将数字解析出来 num = []byte{} } if s[i] == ')' { // 遇到一堆完整的括号了,先计算这个括号里面的额值,然后替换表达式 j := len(data) - 2 // 找到最近的左括号 来做计算 for ; data[j].NType != '('; j-- {} data[j] = node{0, calc(data[j+1:])} data = data[:j+1] } else { data = append(data, node{s[i], 0}) } } if len(num) > 0 { data = append(data, node{0, bsToNum(num)}) } fmt.Println(calc(data)) } func calc(data []node) int { // 无括号表达式的计算 var afterMulAndDivide []node for i:=0;i<len(data); { // 先乘除 if data[i].NType == '*' { afterMulAndDivide[len(afterMulAndDivide)-1].Val *= data[i+1].Val i += 2 } else if data[i].NType == '/' { afterMulAndDivide[len(afterMulAndDivide)-1].Val /= data[i+1].Val i += 2 } else { afterMulAndDivide = append(afterMulAndDivide, data[i]) i++ } } result := afterMulAndDivide[0].Val for i := 1; i < len(afterMulAndDivide); { // 后加减 if afterMulAndDivide[i].NType == '+' { result += afterMulAndDivide[i+1].Val } else if afterMulAndDivide[i].NType == '-' { result -= afterMulAndDivide[i+1].Val } i += 2 } return result } func bsToNum(bs []byte) int { num, _ := strconv.Atoi(string(bs)) return num }