前缀符号字符串计算器Javascript问题
Prefix notation string calculator Javascript problem
我正在为前缀符号字符串制作一个计算器,它涵盖了我添加到其中的所有正常测试。但是我遇到了一个似乎没有得到正确答案的问题,我不确定为什么它似乎有问题。
我认为这可能与数字的除法和减法有关,因为问题的另一个原因是我需要假设所有输入都是有效的,所以不会有负数或会不会有错误输入 IE 格式不正确
下面是代码和我输入进去的一些测试题
"+ / * 1 3 + 12 16 * 10 4" = 40.107142857142854
"+ * / - 5 3 / 1 3 + 2 2 / 3 * + 12 16 * 10 4" = 24.00267857142857 --- This is the one it doesn't like
"/ 300000 * + 12 16 * 10 40"= 26.785714285714285
function prefixEval(expression) {
let temp = expression.split(' ')
let expr = temp.reverse()
let stack = []
for (let i = 0; i < expr.length; i++) {
if (
expr[i] === '+' ||
expr[i] === '-' ||
expr[i] === '/' ||
expr[i] === '*'
) {
let j = stack.pop()
let k = stack.pop()
let temp = checkOperator(parseInt(j), parseInt(k), expr[i])
stack.push(temp)
} else {
stack.push(expr[i])
}
}
return stack
}
function checkOperator(a, b, op) {
switch (op) {
case '+':
console.log('adding' + ' ' + a + ' ' + op + ' ' + b)
console.log(a + b)
return a + b
case '-':
console.log('subtracting' + ' ' + a + ' ' + op + ' ' + b)
console.log(a - b)
return a - b
case '/':
console.log('dividing' + ' ' + a + ' ' + op + ' ' + b)
console.log(a / b)
return a / b
case '*':
console.log('multiplying' + ' ' + a + ' ' + op + ' ' + b)
console.log(a * b)
return a * b
default:
return 'this is not correct'
}
}
console.log(prefixEval('+ * / - 5 3 / 1 3 + 2 2 / 3 * + 12 16 * 10 4'))
您正在使用 parseInt
并将 2
除以 0
得到 Infinity
。要修复,
改变,
let temp = checkOperator(parseInt(j), parseInt(k), expr[i])
到
let temp = checkOperator(parseFloat(j), parseFloat(k), expr[i])
这是给你预期的答案
我正在为前缀符号字符串制作一个计算器,它涵盖了我添加到其中的所有正常测试。但是我遇到了一个似乎没有得到正确答案的问题,我不确定为什么它似乎有问题。
我认为这可能与数字的除法和减法有关,因为问题的另一个原因是我需要假设所有输入都是有效的,所以不会有负数或会不会有错误输入 IE 格式不正确
下面是代码和我输入进去的一些测试题
"+ / * 1 3 + 12 16 * 10 4" = 40.107142857142854
"+ * / - 5 3 / 1 3 + 2 2 / 3 * + 12 16 * 10 4" = 24.00267857142857 --- This is the one it doesn't like
"/ 300000 * + 12 16 * 10 40"= 26.785714285714285
function prefixEval(expression) {
let temp = expression.split(' ')
let expr = temp.reverse()
let stack = []
for (let i = 0; i < expr.length; i++) {
if (
expr[i] === '+' ||
expr[i] === '-' ||
expr[i] === '/' ||
expr[i] === '*'
) {
let j = stack.pop()
let k = stack.pop()
let temp = checkOperator(parseInt(j), parseInt(k), expr[i])
stack.push(temp)
} else {
stack.push(expr[i])
}
}
return stack
}
function checkOperator(a, b, op) {
switch (op) {
case '+':
console.log('adding' + ' ' + a + ' ' + op + ' ' + b)
console.log(a + b)
return a + b
case '-':
console.log('subtracting' + ' ' + a + ' ' + op + ' ' + b)
console.log(a - b)
return a - b
case '/':
console.log('dividing' + ' ' + a + ' ' + op + ' ' + b)
console.log(a / b)
return a / b
case '*':
console.log('multiplying' + ' ' + a + ' ' + op + ' ' + b)
console.log(a * b)
return a * b
default:
return 'this is not correct'
}
}
console.log(prefixEval('+ * / - 5 3 / 1 3 + 2 2 / 3 * + 12 16 * 10 4'))
您正在使用 parseInt
并将 2
除以 0
得到 Infinity
。要修复,
改变,
let temp = checkOperator(parseInt(j), parseInt(k), expr[i])
到
let temp = checkOperator(parseFloat(j), parseFloat(k), expr[i])
这是给你预期的答案