使用java编程思想计算字符串“3*4+6/2-1”的数值,(最后的结果是14) 15
2个回答
展开全部
求一个算式的值,你的程序需要对输入的公式进行词法语法分析,并考虑优先级,将其变化为一系列2项数的操作。考虑一般多项式的情况,即包括+, -, *,/,括号。
一般首先有一个堆栈,把每一个元素(括号,数字,操作符)压栈,然后每遇到一个右括号时出栈到最近的左括号,得到一个相对简单的算式,计算这个算式的结果并将其压栈。。。。直到遇到算式尾。这样复杂的公式求解就已经分解成了解决一系列不含括号的算式的问题。
处理不含括号的算式(或者不考虑包含括号的多项式),计算其结果,就需要词法分析,从左往右遇到乘除就做,加减先不做,然后只剩加减,就再从左往右逐次进行。计算过程一般会有另一个栈操作,将各元素逐一作如下操作:非*,/运算符:压栈;*,/运算符:出栈,出栈元素与下一项计算结果,将结果入栈。当遍历一遍完成时,;*,/运算计算完毕,再次遍历堆栈进行+,-操作。
例如3*4+6/2-1,没有括号,第一遍遍历:3入栈,遇到*,3出栈与4相乘=12,12入栈,+入栈,6入栈,遇到/时6出栈与2除=3,3入栈,-入栈,1入栈。此时栈内元素:12,+,3,-,1,再次遍历计算即可得14
一般首先有一个堆栈,把每一个元素(括号,数字,操作符)压栈,然后每遇到一个右括号时出栈到最近的左括号,得到一个相对简单的算式,计算这个算式的结果并将其压栈。。。。直到遇到算式尾。这样复杂的公式求解就已经分解成了解决一系列不含括号的算式的问题。
处理不含括号的算式(或者不考虑包含括号的多项式),计算其结果,就需要词法分析,从左往右遇到乘除就做,加减先不做,然后只剩加减,就再从左往右逐次进行。计算过程一般会有另一个栈操作,将各元素逐一作如下操作:非*,/运算符:压栈;*,/运算符:出栈,出栈元素与下一项计算结果,将结果入栈。当遍历一遍完成时,;*,/运算计算完毕,再次遍历堆栈进行+,-操作。
例如3*4+6/2-1,没有括号,第一遍遍历:3入栈,遇到*,3出栈与4相乘=12,12入栈,+入栈,6入栈,遇到/时6出栈与2除=3,3入栈,-入栈,1入栈。此时栈内元素:12,+,3,-,1,再次遍历计算即可得14
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询