javaee论坛

普通会员

225648

帖子

355

回复

369

积分

楼主
发表于 2017-07-22 03:02:37 | 查看: 326 | 回复: 1
在计算一个表达式的时候,可以用数据结构中栈的知识,将我们平常熟悉的中缀表达式转为后缀表达式,再将后缀表达式进行计算得到结果。先说下什么是中缀什么是后缀:

中缀表达式:eg: 9+(3-1)*3+10/2,就是我们平常计算时的表达式;

后缀表达式:eg: 9 3 1 - 3 * + 10 2 / + ,不包含括号,运算符在两个运算对象后面的表达式。

1.中缀表达式转后缀表达式

我们先初始化一个空的字符串(String)和栈(Stack),将这个中缀表达式中的数字和运算符(包括加减乘除及左右括号)分割成一个个字符串存进一个新的数组中,比如上面的中缀表达式就存为:9  +  (  3  -  1  )  *  3  +  10  /  2  (简便起见用空格将一个个字符串隔开了...) 然后遍历这个数组,运算对象就直接放进刚才初始化的String中,栈中存放的是运算符。如果是空栈,加减乘除或左括号就直接进栈,如果栈不为空,此时扫描到的运算符与栈顶运算符做优先级比较,如果栈顶运算符优先级低于扫描的运算符,则当前扫描运算符入栈,否则栈顶运算符弹栈并连接在String后,并与弹栈后的站定运算符再做比较,直到站定运算符低于当前扫描的运算符或遇到左括号,并将当前运算符进栈当前运算符若是右括号,则将栈顶运算符依次弹出并依次连接到String后,直到遇到左括号,并将左括号弹出(但是不连接在String后的,注意后缀表达式中是没有括号的)。如果中缀表达式遍历完毕后栈中还有运算符则将栈中剩下的运算符依次弹出并连接在String后面;最终得到的就是字符串String后缀表达式。

2.后缀表达式的计算

先初始化一个栈,这个栈是用来存放运算对象的,然后定义一个变量存放最后的结果。遍历到数字则依次进栈,遍历到运算符的时候将栈顶运算符弹出(假设赋给变量a),再将此时的栈顶运算符弹出(假设赋给变量b),用后者对前者做该运算符对应的运算(假设遍历当前的运算符为+,则做计算b+a),然后将计算结果入栈。以此方式遍历整个字符串,最终的结果即为运算结果。



普通会员

1

帖子

334

回复

347

积分
沙发
发表于 2024-04-28 05:59:07

楼主你知道的太多了

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017