数据结构课摸鱼写着玩的东西,可以优化的地方应该非常多(比如存入切片的操作可以在输入时完成,不支持小数,没有解决"要一杯洗脚水"这样的问题……),看着图一乐就好
关于什么是后缀表达式:后缀表达式
大体想法是用字符串读入数字与符号,然后存入int32的切片去处理,处理的时候是看到符号后就近计算为一个数字
package main
import "fmt"
//用于输入带' '的字符串
func ScanLine() string {
var c byte
var err error
var b []byte
for ; err == nil; {
_, err = fmt.Scanf("%c", &c)
if c != '\n' {
b = append(b, c)
} else {
break;
}
}
return string(b)
}
func main(){
var str string
str=ScanLine()
arr:=[]int32{}
k:=int32(0)
for _,j:=range str{
if j==' '{
arr=append(arr,k)
k=0
}else {
//if和else if用于处理负数,'-'减'0'等于-3,类似的可以做到小数,不过偷懒没写
if k==-3 {
k = '0' - j
}else if k<0{
k*=10
k-=j-'0'
}else{
k*=10
k+=j-'0'
}
}
}
arr=append(arr,k)
// '+' -5
// '-' -3
// '*' -6
// '/' -1
lenArr:=len(arr)
arr=append(arr,0)
i:=0
for {
if i==lenArr {break}
//如果arr[i]是一个运算符则把包括arr[i]的式子算出来,变为一个数字再写进去
switch arr[i] {
case -5:
arr[i-2]+=arr[i-1]
arr=append(arr[:i-1],arr[i+1:]...)
lenArr-=2
i--
case -3:
arr[i-2]-=arr[i-1]
arr=append(arr[:i-1],arr[i+1:]...)
lenArr-=2
i--
case -6:
arr[i-2]*=arr[i-1]
arr=append(arr[:i-1],arr[i+1:]...)
lenArr-=2
i--
case -1:
arr[i-2]/=arr[i-1]
arr=append(arr[:i-1],arr[i+1:]...)
lenArr-=2
i--
default:
i++
}
}
fmt.Println(arr[0])
}