задача пары скобок в javascript

пример скобок [] () || 77 88 23 54 <>, надо в строке посмотреть совпадают ли все пары. Есть решение через стек. Просто когда скобки одинаковые то он не видит закрывающую, если смотрю через стек и добавляю открывающие, не догоняю как добавить проверку что при четных еще и последняя в стеке такая же

function check(str, bracketsConfig) {
   
    
    let brackets = bracketsConfig.join('').replace(/,/g, '');
        let stack = [];
    for (let bracket of str) {
            let bracketsIndex = brackets.indexOf(bracket)

            if (bracketsIndex % 2 === 0) {
                stack.push(bracketsIndex)
                if (bracket === brackets[bracketsIndex+1]){
                    stack.pop();
                }
                
            } 
            else {
                if (stack.pop() !== bracketsIndex-1){
                    return false;
                }
            }
            
        }
        return stack.length === 0
    
}

пример вызова

check('|(|)', [['(', ')'], ['|', '|']])

check('5555512575557777777555566667888888667661133833448441111222233333444442266666' , [['1', '2'], ['3', '4'], ['5', '6'], ['7', '7'], ['8', '8']])
check('((()))()',[['(', ')']])


Ответы (2 шт):

Автор решения: костя черникович
function check(str, bracketsConfig) {
   
    let brackets = bracketsConfig.join('').replace(/,/g, '');
        let stack = [];
    for (let bracket of str) {
            let bracketsIndex = brackets.indexOf(bracket)

            if (bracketsIndex % 2 === 0) {
                
                if (bracket === brackets[bracketsIndex + 1] && stack[stack.length - 1] === bracketsIndex){
                    stack.pop();
                } else if (bracket === brackets[bracketsIndex + 1] && stack[stack.length - 1] !== bracketsIndex) {
                    stack.push(bracketsIndex)
                }
                else{
                    stack.push(bracketsIndex)
                }
            } 
            else {
                if (stack.pop() !== bracketsIndex-1){
                    return false;
                }
            }
            
        }
        return stack.length === 0
    
}

вот оно решение, хотя б у меня работает, проверка на пары скобок если есть скобки одинаковые || 77 88 и тд все не догонял как сделать проверку что б если скобки одинаковые разделить их

→ Ссылка
Автор решения: eccs0103

Упрощаем вашу задачу с помощью встроенных функций:

function check(string, brackets) {
  const pairs = new Map(brackets); // Создаем коллекцию из пар скобок для удобного поиска.
  const stack = []; // Создаем пустой стек
  for (const char of string) { // Цикл, который проходит через всю строку
    if (pairs.get(stack.at(-1)) == char) { // Если пара последнего символа в стеке тот же что и в строке на данный момент
      stack.pop(); // удаляем его из стека
    } else { // во всех других случаях
      stack.push(char); // добавляем в конец стека
    }
  }
  return stack.length == 0; // В конце проверяем пустой ли у нас стек
}

console.log(check('|(|)', [['(', ')'], ['|', '|']]));
console.log(check('5555512575557777777555566667888888667661133833448441111222233333444442266666', [['1', '2'], ['3', '4'], ['5', '6'], ['7', '7'], ['8', '8']]));
console.log(check('((()))()', [['(', ')']]));

→ Ссылка