0

为波兰表示法工作,我正在添加一种方法来区分我得到的字符串是否是数字,使用 isNaN 函数。这可以正常工作,直到您将 ++ 添加到字符串中。

function cuttingString(list) {
    let adjustArr = list.split(' ')
    let topper = []
    for (let i = 0; i < adjustArr.length; i++) {
        if (!isNaN(adjustArr[i])) {
            topper.push(adjustArr[i])
            console.log(topper)
        } else {
            let j = topper.pop()
            let k = topper.pop()

            if (adjustArr[i] === '+') {
                topper.push(parseInt(j) + parseInt(k))
            }
        }
    }
}

console.log(cuttingString('* 1 2 30 +'))

'* 1 2 30 +'它的输出按预期工作[1,2,30]但是,当我开始在运算符周围移动时,当我在数组的开头得到一个 NaN 时,[NaN, 1,2,30]这令人难以置信。有关如何解决此问题或其他解决方法的任何想法?

4

1 回答 1

1

您的代码似乎实现了反向波兰表示法,因此如果您不在任何二元运算符之前提供参数,您就不能期望它能够正常工作。所以你不能+在表达式中随意移动。仅当堆栈上至少有两个可用数字时,才会出现二元运算符。如果不是,则调用pop将返回undefined并且parseInt(undefined)is NaN。尽管您还没有实现乘法,但*在堆栈仍然为空时发生乘法是有问题的。

让您的函数返回结果是有意义的,因为您console.log当前只会输出undefined,因此您实际上看不到计算结果。

如果确实,您的想法是为反向波兰表示法实现评估器,那么这就是我将适应您的代码的内容:

function cuttingString(list) {
    // Allow multiple spaces, also at start/end:
    let adjustArr = list.match(/\S+/g); 
    let topper = [];
    // Use for..of loop
    for (let token of adjustArr) {
        if (!isNaN(token)) {
            // Why not convert to number here...
            //   and allow decimals. Use unary plus
            topper.push(+token);
        } else if (topper.length < 2) {
            // Show error message when not enough arguments
            throw "not enough arguments for " + token;
        } else {
            let j = topper.pop();
            let k = topper.pop();
            if (token === '+') {
                topper.push(j + k);
            }
        }
    }
    // Verify that the evaluation is complete
    if (topper.length !== 1) {
        throw "Evaluation did not yield one value but " + topper.length;
    }
    // Return the value 
    return topper.pop();
}

console.log(cuttingString('1 2 30 + +')); // 33
console.log(cuttingString('1 2 + 30 +')); // 33

此代码中的两个示例是您可以将操作员移动到的唯一位置+。例如,以下两项均无效:

console.log(cuttingString('1 2 + + 30'));
console.log(cuttingString('1 + 2 30 +'));

在任何一种情况下,都会出现堆栈没有足够参数用于二元运算符的情况。上面的代码将为此提供特定的错误消息。

于 2021-01-30T15:51:25.067 回答