javascript - 遍历堆栈以获取总和
问题描述
我目前正在使用 Javascript 开发计算器。被点击的按钮被存储在Stack中。例如,我们点击“54”、“+”、“23”。那应该是77,对吧?所以现在我的堆栈显示这个["54", "+", "23", "=", ""] 我希望堆栈的结果如下: ["54", "+", " 23", "=", "", "77"] 如果您知道如何在堆栈中删除空字符串,那就太好了。
const value = event.target.value;
if(isNaN(parseInt(value, 10)))
{
stack.push(value)
stack.push('')
} else if(stack.length > 0)
{
stack[stack.length - 1] += '' + value;
}
if (prevop == '=') {
document.getElementById("textfield").value = "";
}
prevop = value;
我正在尝试实现她下面的逻辑以获得我想要的结果。
var sum = 0;
var stackLength = stack.length;
for(var i = 0; i < stackLength; i++)
{
sum = sum + stack.pop();
stack.push(sum);
}
解决方案
您可以尝试使用eval
. 但请记住,这eval
对于代码注入是危险的:
function calc(stack){
const i = stack.findIndex(x => x === '=');
const expression = stack.slice(0, i).join('');
stack[stack.length - 1] = '' + eval(expression);
return stack;
}
UPD:没有eval
. 请注意,此解决方案未考虑操作员优先级。
function calc(stack) {
let res = +stack[0];
for (let i = 1; i < stack.length; i += 2) {
const operator = stack[i];
const rightNumber = stack[i + 1];
switch (operator) {
case '+': res += +rightNumber; break;
case '-': res -= +rightNumber; break;
case '*': res *= +rightNumber; break;
case '/': res /= +rightNumber; break;
case '=': stack[stack.length - 1] = '' + res; return stack;
}
}
}
推荐阅读
- image - 上传路径在多个上传文件和图像上似乎无效
- python-3.x - TypeError:'int'对象不可调用-1
- javascript - 使用 Javascript ajax 异步更新数据失败
- javascript - 如何在 appmaker 中打印表单?
- angular - 如何使用 ngx-formly 为 2 个字段组制作自定义包装器?
- mysql - 每个类型的每个引用的前 5 行总和,其他所有等于 1,按团队 ID 分组
- xamarin.ios - 未在 Xamarin.IOS 中创建 IPA 文件
- java - 在为 com.ktech:xpira:jar:0.0.1-SNAPSHOT 构建有效模型时遇到了一些问题
- android - 通过 OTP 共享 App Hash 在应用安全方面是否有任何缺点
- javascript - 非 SPA 前端 - 即时交互 JS 元素的最佳实践