后缀算法与中缀算法

中缀算法

就是日常计算中用到的类似a+b的算法表达式;运算符位于两个运算数中间的位置;

后缀算法

相比较中缀表达式的结构,不难推出后缀表达式的格式,就是符号位于两个运算量的后边位置,比如ab+表示的就是a+b;后缀表达式又称逆波兰表达式;
优点在于:可以配合栈(stack)来完成运算,这种运算只需要按顺序进行而不需要考虑运算符的优先级,并且速度很快。
以后缀表达式:abc+de+;为例,他的运算过程是:

1.将a,b先后入栈;
2.读取到*,将a、b出栈,计算ab;将结果再入栈;
3.将c入栈;读取到+;
4.将之前a
b的结果和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
*/

猜你喜欢

转载自blog.csdn.net/wzb_wzt/article/details/107785747
今日推荐