对加减乘除表达式的解析求值

一、背景

        计算机中有算法求类似"1+2*6+1"这样的表达式的值。

 

二、主要思路

  (一)转成后缀表达式

    主要思路:

       1、定义结果数组;

       2、定义字符栈。

       3、遍历表达式:

             如果是数字:把数字加入结果数组,连续遍历和加入结果数组,直到当前位置的下一个字符不是数字;最后在数字末尾加末尾符'#'。

             如果是运算符:判断栈顶的运算符比自己级别高就出栈,直到栈空或者栈顶的运算符级别比自己小或者同级,然后把自己入栈;如果栈空,直接入栈。

            注意:出栈后把运算符加到结果数组的后面。

        4、遍历完毕,如果栈不空,就依次出栈所有运算符,加到结果数组后面。

 

     转换结果:

            假设表达式为"4+5*6",转成后缀表达式为:"4#5#6#*+"

 

   (二)计算后缀表达式的结果

      1、定义整数栈。

      2、遍历后缀表达式:

            如果是数字:继续一直访问到末尾符‘#’,把这一串数字转成整数,入栈到整数栈中。

            如果是运算符:根据运算符,出栈指定个数的数字,进行运算后,把结果入栈到整数栈中。

             例如:遍历到'+',代表是加法,需要连续出栈2次,第1次出栈数字a,第2次出栈数字b,计算b + a的值,把结果入栈到整数栈中。

 

     3、遍历完毕,栈顶的元素就是表达式的结果。

 

 

三、总结

   1、需要设置末尾符才能知道一串数字如何结束(本文末尾符是'#',可以改为其他的)。

   2、越优先的运算就需要先执行,也就是先出栈;低级别的运算符需要靠后出栈。

   3、需要根据运算符出栈数字个数;加法需要出栈2个数,减法、乘法、除法也需要出栈2个数。

 

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值