【js數據結構】棧解決括號不匹配問題


棧可以用來判斷一個算術表達式中的括號是否匹配。

思路:讀取算術表達式,遇到左括號‘{’、‘[’、'('壓入棧,棧的特點是后入先出,所以當遇到右括號‘}’、‘]’、')'的時候,取出棧頂元素,是否滿足讀取的右括號,棧頂是與之相匹配的左括號。最后判斷棧是否為空,為空證明該表達式沒有問題,否則則說明這個表達式存在括號不匹配問題。

首先我們構建一個棧。

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函數,最后判斷棧內是否為空~

  代碼又不完善之處還請各位大人多多提醒,小女子這廂有禮了>.<


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM