带有用户定义变量的Java控制台计算器

时间:2014-09-29 01:51:37

标签: java algorithm calculator

我已经在这个问题上苦苦挣扎了一段时间,我试图实现一个java计算器程序,它将从控制台评估数学表达式。困难在于,该程序还必须接受来自控制台的用户定义变量,并使用关键字:" define",然后对它们进行评估。

例如,用户键入

"(定义i = 3)+ 4 * 2"

进入控制台,程序将识别关键字" define",并将表达式评估为

3 + 4 * 2 = 11。 />
主要问题是我不知道如何处理这个问题,因为层次结构可能变得非常复杂,特别是当你有这样的事情时:

"(定义i =(定义) j =(定义k = 5)+7)+3)-k"。

在这种情况下,k = 5,j = k + 7 = 12,i = j + 3 = 15,所以result = ik = 10(计算器返回该值)。
<登记/> 您还可以在一个表达式中定义/重新定义相同的变量,如下所示:

(定义i =(定义i = 1)+1) - (定义i = 1)

在这里,我将首先= 1,然后i = i + 1 = 2,然后我将被重新定义为1,因此整个表达式的计算结果为1 + 1-1 = 1。

任何不平衡的括号,没有define语句的变量都将被识别为错误
我的方法:

首先将表达式转换为常规数学表达式,即将所有用户定义的变量替换为其对应的值,然后计算整个表达式。但是当你有nest define语句时,即使这很困难。为了完成这个&#34;更换过程&#34;,我尝试了以下方法:

步骤1.使用正则表达式匹配表达式,例如&#34;让[a-zA-z] + = [0-9] +&#34;,这对应于&#34;具有实际值的变量引用&#34;,如果我有&#34;(定义i =(定义j =(定义k = 5)+7)+3)-k&#34;,我的程序会尝试找到&#34; ; k = 5&#34;。

步骤2.然后,在一个hashmap中存储k = 5,然后替换所有&#34; k&#34;值为5,所以表达式现在看起来像&#34;(定义i =(定义j =(5)+7)+3)-5&#34;。这样,递归地,我希望摆脱所有字母,以便评估表达式
正如您所知,当用户重新定义某个变量时,我的方法不起作用,并且它不会检查我们是否有任何不平衡的括号。

所以我想知道我的方法是否真的可行,还是有更好的方法?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

由于问题相当复杂,我提供的方法是先处理括号表达式。实际上,目标是按照约定的顺序处理信息。在小学,我们学习了PEMDAS(括号,指数,乘法/除法,加法/减法)。

您添加了一个名为define的新(一元)运算符。由于它是您的代码,您应该在操作层次结构中选择它的重要性。也许它总是括号?此外,请注意,您也给出了从左到右的重要性。

在任何情况下,如果每个运算符都是二进制的,则解析数学表达式会更容易。所以你可以假装它。

首先,将表达式解析为数组。例如,表达式

(define i = (define j = ( define k = 5) + 7) + 3) -k

会变成

[ ( , 0 , define i, (, 0, define j, (, 0, define k, 5, ), +, 7, ), -, k ]

然后你会经历并评估。

首先考虑从LeetCode在线评审中完成这个相关问题:https://oj.leetcode.com/problems/evaluate-reverse-polish-notation/