上下文:我正在用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负号一样
问题:根据给出的信息,此代码是否会引起任何固有的问题?也许那些不是由标准方程式产生的。
答案 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计算器中的要求,因为如果您实际上是在运算符之后遇到减号,那么您将永远不会有空的操作堆栈(因为如果您在操作符之后不能使用减号)遇到减号,而不是数字).....至少,无论如何我都没有想到。