后缀算法与中缀算法

4 篇文章 0 订阅
3 篇文章 0 订阅

中缀算法

就是日常计算中用到的类似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
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值