Javascript 用于检查数学表达式不工作的函数

Javascript 用于检查数学表达式不工作的函数,javascript,stack,Javascript,Stack,检查数学表达式不起作用的函数 我在chrome上调试了它,发现当它到达第一个pop(stack.pop()!==chars[I])时,它返回false,但不应该返回false var smarter_validate = function(str) { var chars = str.split(''); var stack = []; var lookup = { '(': ')', '[': ']', '{': '}', '<': '>

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

我在chrome上调试了它,发现当它到达第一个pop(
stack.pop()!==chars[I]
)时,它返回false,但不应该返回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}])'));
var smarter\u validate=函数(str){
var chars=str.split(“”);
var堆栈=[];
变量查找={
'(': ')',
'[': ']',
'{': '}',
''
};
var left=Object.keys(查找);
var right=Object.keys(查找).map(函数(键){
返回查找[键]
});
对于(变量i=0;i
您实际上必须将弹出值的对应结束字符与
字符[i]
进行比较,而不是将弹出值本身进行比较

所以你需要这样做

if (stack.length === 0 || lookup[stack.pop()] !== chars[i]) {
现在,当您从堆栈中
{
时,您将从
查找中查找相应的结束字符,并将其与当前结束字符进行比较


或者,您可以简单地将预期的结束字符推送到堆栈中,这样您就不必在比较过程中进行查找,如下所示

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

表达式可能很复杂,您考虑过使用eval()吗?@目标语法显然与JavaScript表达式语法大不相同。
*2
是故意的吗?看起来您的数学语法是中缀,但这是前缀。
stack.push(查找[chars[i]])
谢谢大家:)如果有人有较短的函数,我很想知道!!