棧可以用來判斷一個算術表達式中的括號是否匹配。
思路:讀取算術表達式,遇到左括號‘{’、‘[’、'('壓入棧,棧的特點是后入先出,所以當遇到右括號‘}’、‘]’、')'的時候,取出棧頂元素,是否滿足讀取的右括號,棧頂是與之相匹配的左括號。最后判斷棧是否為空,為空證明該表達式沒有問題,否則則說明這個表達式存在括號不匹配問題。
首先我們構建一個棧。
function Stack(){
this.top = 0; //棧頂(屬性)
this.arr = []; //用來存放棧的數組(屬性)
this.push = push; //添加元素(方法)
this.pop = pop; //取出棧頂的元素 (方法)
this.peek = peek; //讀取棧頂元素 (方法)
this.clear = clear; //清空棧 (方法)
this.len = len; //返回棧的長度 (方法)
this.isEmpty = isEmpty; //棧是否為空 (方法)
}
函數實現:
function push(ele){
this.arr[this.top++] = ele;
}
function pop(){
return this.arr[--this.top];
}
function peek(){
return this.arr[this.top-1];
}
function clear(){
delete this.arr;
this.top = 0;
this.arr = [];
}
function len(){
return this.top;
}
function isEmpty(){
if (this.len() <= 0)
return true;
else
return false;
}
特別的,peek()與pop()函數不同在於,peek()只是讀取棧頂,而不修改棧頂,而pop()是取出棧頂的元素,棧將壓出棧頂元素。
SignUp()函數接收兩個參數,棧對象stack和讀取的元素ele
function SignUp(stack, ele){
switch (ele) {
case '{':
case '[':
case '(':
stack.push(ele);
break;
case '}':
case ']':
case ')':
topEle = stack.pop();
console.info(stack.top)
if(( topEle=='{'&&ele == '}')|| topEle=='('&&ele == ')'|| topEle=='['&&ele == ']') {
console.info('ok')
}
else{
console.info('括號不匹配');
return;
}
break;
}
}
接下來就是new一個棧對象,讀取表達式,然后一個一個調用SignUp函數了
input1 = document.getElementById('input1').value;
for(var i = 0; i<input1.length; i++)
{
SignUp(stack, input1[i]);
}
if (!stack.isEmpty())
console.info('括號不匹配');
這里,我使用的是在html頁面放置一個id叫input1的input標簽,js獲取其value后使其每一個字符都調用一次SignUp函數,最后判斷棧內是否為空~
代碼又不完善之處還請各位大人多多提醒,小女子這廂有禮了>.<
