后缀表达式全忘了,看了看题解,注释瞎写写,这题就过了
package main import( "fmt" "bufio" "os" "strconv" ) var r *bufio.Scanner // 符号栈 var sign []byte // 数字栈 var res []int // 比较优先级 func priorCompare(c byte, top byte) bool { // 字符串末尾也要踢掉符号栈,因为肯定有一个符号留到最后,是最后一步 if c == '\n'{ return false } if c == '*' { if top=='*' { return false }else{ return true } // 加减必须出栈一个 }else{ return false } } // 计算结果 func getValue(a, b int, sign byte) int { if sign == '*'{ return b*a }else if sign == '+'{ return b+a }else{ return b-a } } func getRevPoland(s string) { // 字符组成数字 digits := []byte{} for i:=0; i<len(s); i++{ c:=s[i] if '0' <= c && c <= '9'{ digits = append(digits, c) }else{ num,_ := strconv.Atoi(string(digits)) res = append(res, num) digits = []byte{} // fmt.Println(res, sign, len(sign)!= 0 && !priorCompare(c, sign[len(sign)-1])) // 遇到符号,数字栈取出两个数,用当前符号运算 // 条件是:符号栈不空且当前符号的可以踢掉符号栈的栈顶符号 for len(sign)!= 0 && !priorCompare(c, sign[len(sign)-1]){ // 出栈两个数 nums1:=res[len(res)-1] res= res[:len(res)-1] nums2:=res[len(res)-1] res= res[:len(res)-1] // fmt.Printf("当前运算数字和符号%v%c%v\n",nums1,byte(sign[len(sign)-1]), nums2) // // 两个数和符号栈顶的符号的运算结果加入数字栈 res = append(res, getValue(nums1, nums2, sign[len(sign)-1])) sign = sign[:len(sign)-1] } sign = append(sign, c) } } } func main() { r := bufio.NewScanner(os.Stdin) for r.Scan(){ sign = []byte{} res = []int{} if r.Text() == "END" { break } // fmt.Println(r.Text()+"\n") getRevPoland(r.Text()+"\n") //最后数字栈剩下的为结果 fmt.Println(res[0]) } }