【问题标题】:Function to check mathematical expression not working检查数学表达式的功能不起作用
【发布时间】:2016-04-17 16:11:01
【问题描述】:

检查数学表达式的函数不起作用。

我在 chrome 上调试了这个,我看到当它到达第一个 pop (stack.pop()!== chars[i]) 时,它返回 false,但它不应该。

var smarter_validate = function(str) {
  var chars = str.split('');
  var stack = [];
  var lookup = {
    '(': ')',
    '[': ']',
    '{': '}',
    '<': '>'
  };
  var left = Object.keys(lookup);
  var right = Object.keys(lookup).map(function(key) {
    return lookup[key]
  });

  for (var i = 0; i < chars.length; i++) {
    if (left.indexOf(chars[i]) !== (-1)) {
      stack.push(chars[i]);
    } else if (right.indexOf(chars[i]) !== (-1)) {
      if ((stack.length === 0) || (stack.pop() !== chars[i])) {
        return false;
      }
    }
  }
  return (stack.length === 0);
};

console.log("SMART VALIDATE" + smarter_validate('(3+4[*2{6+8}])'));

【问题讨论】:

  • 表达式可能很复杂,你考虑过使用 eval() 吗?
  • @Will 目标语法显然与 JavaScript 表达式语法有很大不同。
  • *2 是故意的吗?您的数学语法似乎是中缀,但那是前缀。
  • stack.push(lookup[chars[i]]);
  • 谢谢大家 :) 如果有人有更短的功能,我很想知道!!

标签: javascript stack


【解决方案1】:

您实际上必须将弹出值的相应结束字符与chars[i] 进行比较,而不是弹出值本身。

所以你需要这样做

if (stack.length === 0 || lookup[stack.pop()] !== chars[i]) {

现在,当您从堆栈中{ 时,您将从lookup 中查找相应的结束字符,并将其与当前结束字符进行比较。


或者,您可以简单地将预期的结束字符压入堆栈,这样您就不必在比较期间进行查找,就像这样

stack.push(lookup[chars[i]]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2012-07-22
    相关资源
    最近更新 更多