2013-04-17 2 views
0

Мне нужно написать (на Java, но язык не важен) функцию, которая принимает в скобках выражение (как строку) в качестве входных данных и возвращает коллекцию индексов всех несогласованных скобок ,Найти индексы непревзойденной скобки

Функция должна использовать только стек как вспомогательную структуру данных.

Пример:

Input: ”d(f(b)())o” 
Return:[] 

Input: ”**)**(d(f(b)())) **)** o **(**” 
Return:[0, 12, 14] 

Что такое правильный алгоритм для решения этой проблемы?

+0

Итак, единственный способ решить эту проблему я должен использовать, помимо стека, другую любую структуру (как массив)? – Ewybe

+0

Если вы хотите вернуть индекс ВСЕХ непревзойденных парсеров, то да, вам понадобится что-то вроде массива для их хранения. Если вы хотите, чтобы либо первый, либо непревзойденный, либо да/нет, он был непревзойденным, вы могли бы сделать это без array – TheMerovingian

+0

Хотя вы можете использовать стек как ужасный способ хранения информации. В моем ответе везде, где вы видите 'indices.append()' заменяете 'outputStack.push()'. Таким образом, все ваши значения сохраняются в стеке ('outputStack'). – TheMerovingian

ответ

5

Stacks действительно великолепны для сопоставления скобок. В псевдокоде он будет выглядеть примерно так:

indices = [] 

for i->0, i<length(string), i++ do 

    if string[i] == "(" then 
     stack.push("(") 
     indexStack.push(i) 

    else if string[i] == ")" then 
     if stack.size() < 1 then 
      indices.append(i) 
     else 
      stack.pop() 
      indexStack.pop() 

while indexStack.size() > 0 do 
    indices.append(indexStack.pop()) 

Как пояснить, как это работает.

  • перебирать струны
  • Если char является открытой скобкой, толкать его в стек
  • Если char близкая скобка, проверьте, есть ли какие-либо открытые круглые скобки в стеке
  • Если есть открытый палец, вытащите его из стека (мы нашли совпадение); если нет, то мы имеем несравнимые скобка, индекс записи
  • В конце концов, если есть какие-либо круглые скобки осталось в стеке, они не имеют себе равных, индексы палить indexStack

EDIT: К сожалению, не обработал себе равных open parens

2

Вы могли бы ...

  1. Go слева направо, рассматривая каждый символ
  2. Если это открытая paranthesis добавить его в стек. Добавьте этот номер в список.
  3. Если это закрытая всплывающая скобка из стека. Если вы не можете добавить, добавьте текущий индекс символов в список.
  4. Если вы можете щелкнуть, то удалите последний индекс из открытого списка скобок.
  5. Повторите шаги 2 и 3, пока вы не сделали

Вы можете иметь 2 списка один Заботясь о открывающей скобкой и еще один заботиться о закрытой скобкой. Это упростит удаление индексов.

+1

6. Добавьте все оставленные в стек в список. – Dukeling

+0

@ Dukeling: Да, спасибо. Соответственно внесенные изменения. – npinti

+0

Я не пробовал, но не мог ли ты сделать то же самое без стека?Поскольку стек содержит только открытые парсеры, похоже, что счетчик будет работать. –

Смежные вопросы