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

时间:2018-10-16 22:21:47

标签: java

上下文:我正在用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 个答案:

答案 0 :(得分:0)

是的。该解决方案至少有1个问题。这是当您遇到一个空的var express = require('express'); var router = express.Router(); var connection = require('./database/connection.js'); router.get('/', function(req, res, next) { console.log(req.session.userId); // this small block of code checks to see whether a session is active, which means whether the user is authenticated or not // if this is not the case, the user will be redirected to the login form, ensuring they are validated before they are allowed access var user = req.session.user, userId = req.session.userId; console.log(userId); //console.log('ddd='+userId); if (userId == null) { res.redirect("/login"); return; } req.app.get('db').query("SELECT * FROM customer", function(err, rows, fields) { var customer_list = rows; console.log(customer_list); }) }); 堆栈,而不是一个空的ops堆栈时,因为最终会检查这两种情况,如果堆栈上有一个values。因此,它试图窥视一堆空运算符。显然这会引发错误。

但是,如果要检查操作栈是否为空,然后再尝试进行比较,那应该可以解决。

这也应该满足infix计算器中的要求,因为如果您实际上是在运算符之后遇到减号,那么您将永远不会有空的操作堆栈(因为如果您在操作符之后不能使用减号)遇到减号,而不是数字).....至少,无论如何我都没有想到。