Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有用户定义变量的Java控制台计算器_Java_Algorithm_Calculator - Fatal编程技术网

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

带有用户定义变量的Java控制台计算器,java,algorithm,calculator,Java,Algorithm,Calculator,我已经为这个问题挣扎了一段时间,现在我正在尝试实现一个java计算器程序,它将从控制台计算数学表达式。困难在于,这个程序还必须从控制台接受带有关键字define的用户定义变量,然后对它们进行评估。 例如,用户在控制台中键入define i=3+4*2,程序将识别关键字define,并将表达式计算为3+4*2=11。 主要的问题是我不知道如何处理这个问题,因为层次结构可能变得非常复杂,特别是当你有这样的东西时:define I=define j=define k=5+7+3-k。在这种情况下,k=

我已经为这个问题挣扎了一段时间,现在我正在尝试实现一个java计算器程序,它将从控制台计算数学表达式。困难在于,这个程序还必须从控制台接受带有关键字define的用户定义变量,然后对它们进行评估。 例如,用户在控制台中键入define i=3+4*2,程序将识别关键字define,并将表达式计算为3+4*2=11。 主要的问题是我不知道如何处理这个问题,因为层次结构可能变得非常复杂,特别是当你有这样的东西时:define I=define j=define k=5+7+3-k。在这种情况下,k=5,j=k+7=12,i=j+3=15,所以result=i-k=10计算器返回这个值。 您还可以在一个表达式中定义/重新定义相同的变量,如下所示: 定义i=定义i=1+1-定义i=1 这里,我将首先是=1,然后是i=i+1=2,然后我将被重新定义为1,所以整个表达式的计算结果为1+1-1=1。 任何不平衡的括号、没有define语句的变量都将被视为错误。 我的做法: 首先将表达式转换为正则数学表达式,即用相应的值替换所有用户定义的变量,然后计算整个表达式。但是,当您有嵌套的define语句时,即使这样也很困难。为了完成此替换过程,我尝试了以下方法: 第一步。使用正则表达式匹配像let[a-zA-z]+=[0-9]+这样的表达式,它对应于具有实际值而不是引用的变量,因此如果我定义了I=define j=define k=5+7+3-k,我的程序将尝试查找k=5。 第二步。然后,将k=5存储在hashmap中,然后用值5替换所有k,因此表达式现在看起来像define i=define j=5+7+3-5。这样,递归地,我希望去掉所有的字母,这样表达式就可以计算了。 正如您所知,当用户重新定义某个变量时,我的方法不起作用,并且它不会检查是否有任何不平衡的括号。
所以我想知道我的方法是否可行,或者有更好的方法吗?任何帮助都将不胜感激。

由于问题相当复杂,我提供的方法是首先处理括号表达式。事实上,目标是按照约定的顺序处理信息。小学时,我们学习了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 Online Judge完成这个相关问题:

糟糕的格式设置。不可能读。我模糊地回忆起大学里关于编译器构造的课程,而且——恕我直言——我认为你们的方法都太幼稚了。这个问题听起来最好是通过一本关于编译器和语言理论的好书来解决……看看写一本