【发布时间】: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