使用棧來判斷算術表達式中的括號是否匹配

棧是一種後入先出(LIFO,last-in-first-out)的數據結構。express

假設有一個算術表達式數據結構

let expression = '2.3 + 23 / 12 + (3.14159 * 0.24';

利用後入先出的這個特色,對字符串(算術表達式)進行遍歷,若是遇到左括號"(",就把字符"("壓入棧code

for (let i = 0; i < length; i++) {
    if (expression[i] === '(') {
        stack.push('(');
    }
}

若是遇到右括號")",就把棧頂的字符彈出棧字符串

if (expression[i] === ')') {
    if (stack.length > 0) {
        stack.pop();
    }
}

有兩種狀況能夠判斷表達式的括號是否匹配io

  1. 字符串遍歷結束後,棧的長度不爲零,說明表達式缺乏了右括號
  2. 字符串遍歷過程當中,若是在作彈出棧的動做時,發現棧的長度已經爲零,說明表達式缺乏左括號;

完整代碼以下:ast

function check(expression) {
    let length = expression.length,
        stack = [];

    for (let i = 0; i < length; i++) {
        if (expression[i] === '(') {
            stack.push('(');
        } else if (expression[i] === ')') {
            if (stack.length > 0) {
                stack.pop();
            } else {
                return false;
            }
        }
    }

    return (stack.length <= 0) ? true : false;
}
相關文章
相關標籤/搜索