Jedno z podstawowych i najbardziej popularnych zagadnień stosowych – walidacja nawiasów. Poznajemy ten algorytm!

Ok, oto kod:

function validateBrackets_v2(str){

    const opening = new Set(["(", "[", "{"]);
    const closing = new Set(["}", ")", "]"]);

    let map = new Map();

    map.set("(", ")");
    map.set("[", "]");
    map.set("{", "}");
    
    let stack = [];

    for(let i = 0; i <str.length; i++){
        if(opening.has(str[i])){
            stack.push(str[i]);
        } 
        else if(closing.has(str[i])){
            let lastInserted = stack.pop();
            if(map.get(lastInserted) !== str[i])
                return false;
        }
        
    }

    return stack.length === 0;
    

}

console.log(validateBrackets_v2("((( [[]] {{{}}}  )))"));

Mechanizm działania jest następujący:

  • Przejdź po każdym znaku
  • Jeżeli znak jest znakiem otwierającym, wrzuć go na stos
  • Jeżeli znak jest znakiem zamykającym zrzuć ostatni otwierający ze stosu i porównaj, czy są odpowiednie (czy się zgadzają otwarcie z zamknięciem)
  • Jeżeli pętla się zakończyła i nie było return false to i tak trzeba porównać, czy stos jest pusty, (edge case gdy ktoś otworzył więcej niż zamknął co nie zostało wykryte wcześniej z oczywistych względów)

Możemy tam dodać kolejne znaki, np. < oraz > i dalej będzie ok…