我正在制作一个计算器应用程序来挑战自己,我需要一手策划我的逻辑。事实是,等式是单个字符串,我需要以某种方式计算我正在评估的运算符的左侧和右侧的数字(有一个操作顺序)。挑战在于还有一元运算符,这意味着我不能简单地假设一个数字(在任何一方)由另一个运算符分隔。
例如 - 我试图评估像5 + 5 ^ -2-3这样的东西。操作顺序意味着我首先关注^,所以我需要得到5和-2,计算出来,然后将等式更新为5 + 25-3然后按顺序评估其余的操作。
有什么想法吗?感谢。
答案 0 :(得分:2)
有一种着名的算法可以解决这个问题。它被称为Shunting Yard Algorithm
答案 1 :(得分:1)
您可以使用正则表达式。例如
/(\d+)([\+\*])(\d+)/g
将匹配加号或乘号的任一侧的任何数字组。适用于
"47+65"
会给3组,第一组为“47”,第二组为“+”,第三组为“65”。
显然你需要考虑所有可能的运营商。在更复杂的等式中,您需要获得所有匹配并执行一些条件检查以确定首先应用哪个组。您可能还需要考虑括号 - 即它们是否影响操作顺序 - 并包含在正则表达式中
编辑:只是为了好玩(并且由于投票不足),我创建了一个简单的示例here(加号,减号,乘法和除法运算符,没有空格数字和运算符之间)
编辑2: Updated fiddle(允许表达式和十进制数中的多个运算符)
编辑3: Updated fiddle(包括电源操作员 - 2 ^ 3 = 8)
编辑4: Updated fiddle(考虑括号,空格,除以零)
答案 2 :(得分:0)
首先想到一个树状结构。但是如果你想要它非常简单,取决于我创建一个数组的语言
[[5,number],[+,operator1],[5,number],[^,operator3],[-2,number],[-,operator1],[3,number]]
然后对每个操作员进行检查:
1) [[5,number],[+,operator1],[0.04,number],[-,operator1],[3,number]]
2) [[2.04,number]]