中缀算法
就是日常计算中用到的类似a+b的算法表达式;运算符位于两个运算数中间的位置;
后缀算法
相比较中缀表达式的结构,不难推出后缀表达式的格式,就是符号位于两个运算量的后边位置,比如ab+表示的就是a+b;后缀表达式又称逆波兰表达式;
优点在于:可以配合栈(stack)来完成运算,这种运算只需要按顺序进行而不需要考虑运算符的优先级,并且速度很快。
以后缀表达式:abc+de+;为例,他的运算过程是:
1.将a,b先后入栈;
2.读取到*,将a、b出栈,计算ab;将结果再入栈;
3.将c入栈;读取到+;
4.将之前ab的结果和c出栈,计算他们的和,再入栈;
5.以此类推;需要注意的是;遇到运算符时需要用先入栈的值来运算后入栈的那个值;
此外;如果当前运算符不是最后一个符号;那么需要把计算的结果再次入栈等待下次出栈计算;否则直接作为结果来输出
代码案例:
根据给定的切片(逆波兰表达式格式的切片)来计算出最终结果
func evalRPN(tokens []string) int {
num:=[]int{}
for _,arg:= range tokens{ //for range 来遍历切片中的string
numLen:=len(num)
switch arg{ //使用switch,来甄别运算符
case "+":
num =append(num[:numLen -2],num[numLen-2]+num[numLen-1])
case "-":
num =append(num[:numLen -2],num[numLen-2]-num[numLen-1])
case "*":
num =append(num[:numLen -2],num[numLen-2]*num[numLen-1])
case "/":
num =append(num[:numLen -2],num[numLen-2]/num[numLen-1])
default:
n,_:= strconv.Atoi(arg) //对于非运算符的string转换为int,压入num,等待取出计算
num=append(num,n)
}
}
return num[0]
}
运算示例
func main(){
c:=[]int{"2","2","+","3","*"}
fmt.Println(evalRPN(c))
}
/*
output:
12
*/