栈可以用来判断一个算术表达式中的括号是否匹配。编写一个函数,该函数接受一个算术表达式作为参数,返回括号缺失的位置。下面是一个括号不匹配的算术表达式的例子:2.3 + 23 / 12 + (3.14159×0.24。
首先,我们都知道括号是成双成对的,不可能有单个的括号。所以,要判断它是否匹配,是否符合条件,只需要判断有没有和它相对应的符号即可。例如 '(' 对应 ')','[' 对应 ']' ,'{' 对应 '}'。
因此,我们可以先遍历字符串,如果出现了 '(' '[' '{',可以让它进栈;若是出现相对应的符号,则让它出栈,否则,括号不匹配,返回下标位置。下面就是判断括号是否匹配的matchBracket方法:
function matchBracket(data) {
var index=-1;
var stack = new Stack();
//把字符串转为数组
var buffer = data.split();
//获得数组的长度
var length = buffer.length;
for(var i=0;i<length;i++){
//获得其中的每个字符
var word = buffer[i];
//indexOf如果要检索的字符串值没有出现,则该方法返回 -1
if(['{','[','('].indexOf(word)!=-1){
stack.push(word);
}else{
var peek=stack.peek();
switch(word){
case '}':
if(peek=='{'){
stack.pop();
}else{
index=i;
return index;
}
break;
case ']':
if(peek=='['){
stack.pop();
}else{
index=i;
return index;
}
break;
case ')':
if(peek=='('){
stack.pop();
}else{
index=i;
return index;
}
break;
}
}
}
return index;
}
至于上面提到的进栈、出栈方法,相信大家都不陌生,直接看代码好了:
1、进栈
this.dataStore = [];
这是定义的数组
this.push = function (data) {
//获得当前下标
var index = this.dataStore.length;
//添加数据
this.dataStore[index] = data;
// this.dataStore.push(data);
}
2、出栈
this.pop = function () {
return this.dataStore.pop();
}
3、取出栈顶元素
this.peek = function () {
//获得数组的长度
var length = this.dataStore.length;
if (length <= 0)
return null;
return this.dataStore[length - 1];
}