使用此快捷方式会导致问题吗?

  • 本文关键字:问题 快捷方式 java
  • 更新时间 :
  • 英文 :


>CONTEXT:我正在用Java制作一个中缀计算器,现在我正在实现一元正负。如果运算符位于预期值的位置,则该运算符是一元的。这将是以下任何一项:在开头、运算符之后或左括号之后。

相关信息:(假设我在本节中所说的按预期工作...因为它确实如此。

我在一行中读取(事先检查为等式(,并将其存储为字符串数组,由空格分隔,称为readin[]

当我在这个等式中遇到一个"运算符"(加号、减号、开括号等(时,我会将其推送到一个名为ops的堆栈中。右括号除外,这会强制计算到最后一个左括号,以及这些一元运算符。

当我遇到一个"值"(即一个已知的、初始化的变量或一个数字(时,我会把它推送到值堆栈。所有变量都必须以字母开头。

我在readin[]中循环浏览每个元素,跟踪值i,因此i是当前元素,i-1是我们当前正在查看的数组中的前一个元素。

除了少数例外,所有的数学都是在解释完整的方程后完成的。

快捷方式(代码(:

if(readIn[i].charAt(0) == '-'){

if(ops.empty() && values.empty()){
//is unary, set negative
}
else if( readIn[i-1].charAt(0) == ops.peek() ){
//is unary, set negative
}
//it isn't unary, continue onwards
}

它在做什么(简单的英语(:它检查我们是否遇到了减号,如果我们遇到了,它会检查以下内容。如果以下任一为真,则此减号被视为"一元"。

如果运算符堆栈为空,则值堆栈也为空。如果公式中的前一个元素位于运算符堆栈上,因此是运算符。

为什么要这样做?因为如果我们没有遇到减号,那么我们肯定没有遇到一元减号。

如果我们的堆栈上没有任何东西,那么我们要么在某个地方灾难性地失败,要么我们处于等式的开始。如前所述,开头的运算符表示一元运算符。(但是,我认为运算符堆栈在确定这一点方面不太有用,因此这可能是多余的检查。

如果字符串数组中的最后一个元素是运算符(包括左括号(,那么我们在运算符之后遇到这个减号,这也表示一元运算符。

顺便说一下,"设置负数"只是翻转一个布尔值,该值修改下一个传入值,因此 5 个连续的减号应该"添加下一个值的负数",就像 1 个减号一样。

问题:根据给出的信息,此代码是否会产生任何固有问题?也许那些不会由标准方程产生的结果。

是的。此解决方案至少存在 1 个问题。当您遇到空的ops堆栈,而不是空的values堆栈时,因为它最终会检查这两种情况,如果堆栈上有value。因此,它试图窥视一个空的运算符堆栈。这显然会引发错误。

但是,如果您要在尝试查看和比较操作堆栈之前添加对操作堆栈是否为空的检查,那么这应该可以解决。

这也应该仍然满足中缀计算器的要求,因为如果您实际上在运算符之后遇到减号,您将永远不会有一个空的 ops 堆栈(因为如果您遇到减号而不是数字,则无法使用它(.....至少,在任何情况下我都想不到。

最新更新