Плохо работает баланс скобок JavaScript [дубликат]

307
16 марта 2018, 15:25

На данный вопрос уже ответили:

  • Вернуть true если скобки совпадают 3 ответа

var str = prompt('Введите строку',''); 
 
 function bracked(str) { 
    var a = str.match(/\(/gm), 
        b = str.match(/\)/gm); 
    return a && b ? a.length == b.length : a == b; 
} 
 alert(bracked(str)) 
 

Реализация задания со скобками говорит, что в строке ))(( они расставлены верно

Answer 1

const str = prompt('Введите строку', '))(('); 
 
const bracked = str => 0 === [...str].reduce((opened, symbol) => { 
    switch(true) { 
        case opened === false: case opened < 0: return false; 
        case symbol == '(': return ++opened; 
        case symbol == ')': return --opened; 
        default: return opened; 
    } 
}, 0) 
 
console.log(str, bracked(str)) 
 

Answer 2

Вот валидатор, который я писал N лет назад. Суть такая, что мы по последовательно идём по строке, и если встречаем элемент из openers, то добавляем его индекс в массив arr. Если встречаем элемент из closers, то сравниваем его индекс с последним числом в массиве arr (удаляя его из этого массива) и если оно не равно индексу из closers, то валидация не пройдена.

Этот скрипт может свалидировать такие вложенные последовательности различных скобок: [()](){{}}

var input = document.querySelector('input'); 
 
function isValid() { 
  var str = input.value, 
    openers = '<{[(', 
    closers = '>}])', 
    arr = [], 
    valid = true; 
 
  for (var i = 0, len = str.length; i < len; i++) { 
    if (openers.indexOf(str[i]) >= 0) { 
      arr.push(openers.indexOf(str[i])); 
    } else if (closers.indexOf(str[i]) >= 0) { 
      if (closers.indexOf(str[i]) != arr.pop()) { 
        valid = false; 
      } 
    } 
  } 
 
  if (arr.length) { 
    valid = false; 
  } 
 
  input.className = valid ? 'valid' : 'error'; 
} 
 
input.addEventListener('keyup', isValid)
* { 
  font-size: 1.2em; 
} 
 
input { 
  width: 98%; 
  padding: 0.2em; 
} 
 
.error { 
  background-color: #ffc6c6; 
} 
 
.valid { 
  background-color: #bdffc6; 
}
<input type="text" />

Answer 3

в случае одного вида скобок, задачу можно решить просты подсчетом: при открывающей скобке - увеличивать счетчик, при закрывающей - уменьшать.

Если счетчик стал отрицательным - строка некорректная, если по завершении проверки счетчик больше 0, строка некорректная.

var str = '))(('; 
 
function bracked(str) { 
  var counter = 0; 
  for (var i = 0; i < str.length; i++) { 
    if (str[i] == '(') counter += 1; 
    else { 
      counter -= 1 
      if (counter < 0) return false; 
    } 
  } 
  return counter == 0; 
} 
console.log(bracked('))(('), bracked('()(())()'))

Также данную задачу можно решить при помощи стека:

  1. если текущий символ открывающая скобка - заносим его в стек
  2. если текущий символ закрывающая скобка
    1. выталкиваем символ с вершины стека, если полученный символ не открывающаяся скобка - строка не валидная
    2. если открывающаяся переходим к следующему символу из строки

var str = '))(('; 
 
function bracked(str) { 
  var stack = []; 
  for (var i = 0; i < str.length; i++) { 
    if (str[i] == '(') stack.push('('); 
    else { 
      var prev = stack.pop(); 
      if (prev != '(') return false; 
    } 
  } 
  return stack.length == 0; 
} 
console.log(bracked('))(('), bracked('()(())()'))

такой подход довольно просто расширяется на несколько видов скобок. Для этого необходимо добавить объект для соответствия открывающих и закрывающих символов, и вместо открывающих в стек складывать закрывающие.

var str = '))(('; 
 
function bracked(str) { 
  var bracketmap = { 
    '(':')', 
    '{':'}', 
    '[':']' 
  }; 
  var stack = []; 
  for (var i = 0; i < str.length; i++) { 
    if (str[i] in bracketmap) stack.push(bracketmap[str[i]]); 
    else { 
      var prev = stack.pop(); 
      if (prev != str[i]) return false; 
    } 
  } 
  return stack.length == 0; 
} 
console.log(bracked('([})]'), bracked('([])[{()}]([])'))

READ ALSO
Самопроизвольное выполнение action в redux

Самопроизвольное выполнение action в redux

Имеется такой код(прилагаю важные части для понимания)Игра найди пару

189
Carousel Thumbnails (карусель в каруселе)

Carousel Thumbnails (карусель в каруселе)

Всем приветСобственно вопрос как сделать в Owl Carousel, Thumbnails так же каруселью

150
trigger input type color

trigger input type color

При загрузкe страницы в input type="color" есть value, которое содержит уже по умолчанию цвет #0000ff - пробую сделать через trigger("input"), но ничего не происходит:

186