首页 > 解决方案 > 遍历堆栈以获取总和

问题描述

我目前正在使用 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);
            }

标签: javascriptarraysstack

解决方案


您可以尝试使用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;
        }
    }
}

推荐阅读