Как проверить соответствие скобок в Java?

Для моего домашнего задания мы должны использовать стеки, чтобы сделать калькулятор с использованием инфикса и постфикса в java. Пока я читаю уравнения из файла, там много скобок. Я должен убедиться, что они совпадают и отображать сообщение об ошибке, если они пусты или есть совпадающие скобки. Я не уверен, как проверить соответствие скобок. Любой код или помощь с логикой, стоящей за ним, помогут. Я потратил много времени, пытаясь понять довольно небольшую часть этой домашней работы.

Входной файл содержит: (((A + B) - (C - D)) / (E - F)) (((A))) (A) ((A (B D) D)) () (( ) ) (((А + В))) ((А * В)) (А / В) А * В А / В + С А ^ (В - С) (((С ^ Е))) D ( А - В * В) А- В / С ( А / В * С) ( А - С ^ С) ( А * С ^ С) ( D / С ^ С) А - С ^ С А - В * С + D / Е А*В - C ^ C ^ D A B - C ^ C ^ D (( A - B * C) ^ D ^ E) ^ ( F / G * H + I ) (A - B) * (( C * D ) + E) ((( )(( ) )(((( )))) ((( )(( ) (((( )))) A * ( B / C) + D( A - B) A * ( B / В) + D ^ ( А - В) А * ( В / С) + D ^ А - В


person Shark Surfer    schedule 03.03.2014    source источник
comment
Что вы сделали до сих пор?   -  person GreenMatt    schedule 04.03.2014
comment
Покажите нам, что вы пробовали, и тогда мы сможем помочь. Мне жаль, что вы потратили время, пытаясь понять небольшую часть домашнего задания, но это часто происходит, когда вы программируете. Как бы вы сканировали ввод? Как бы вы создали/инициализировали стек? Попробуйте что-нибудь.   -  person bedwyr    schedule 04.03.2014
comment
Я создал класс стека (массив), прочитал значения переменных и установил их, а также прочитал в этом файле. Однако я не уверен, должен ли я выполнять проверку скобок в инфиксной части или во время вычисления постфикса.   -  person Shark Surfer    schedule 04.03.2014
comment
Спасибо всем, что нашли время, чтобы дать мне ответы. Я понимаю это сейчас. Вы очень помогли.   -  person Shark Surfer    schedule 04.03.2014
comment
Сопоставление круглых скобок возникает естественным образом при анализе ввода и преобразовании его в постфикс. Вам не нужен отдельный шаг.   -  person user207421    schedule 27.02.2017


Ответы (4)


Подумайте об этом логически. Как узнать, совпадают ли они? Если у вас есть закрывающая скобка после открывающей скобки.

Вот общий алгоритм:

  • Если встретите открывающую фигурную скобку "(", добавьте в стек
  • Если встретите закрывающую фигурную скобку ")", извлеките ее из стека
  • Если вы столкнулись с закрывающей фигурной скобкой, внимательно проверьте размер стека. Если в стеке ничего нет, то это тоже ошибка.

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

person trevor-e    schedule 03.03.2014

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

person stack smasher    schedule 03.03.2014

Попробуйте изучить структуру данных стека. Это структура типа первым пришел-последним вышел, в которой вы можете хранить несколько элементов в определенном порядке и всегда извлекать их в обратном порядке.

Затем вы можете сканировать код и каждый раз, когда находите открывающую скобку, помещать ее в стек, а когда находите закрывающую, вы выталкиваете открывающую скобку. Когда вы дойдете до конца кода, стек должен быть пуст, и вы никогда не должны сталкиваться с ситуацией, когда вы выталкиваете пустой стек, тогда вы знаете, что круглые скобки верны.

person Warlord    schedule 03.03.2014

Это просто. Прочитайте из входного файла.
Если вы прочитали '(', добавьте его в стек.
Если вы прочитали ')' посмотрите, что находится на вершине стека.

  • Если стек пуст, выдать ошибку.
  • Если это '(', то извлеките из стека, игнорируйте char ')', который вы только что прочитали, и продолжите чтение.
  • Если это не '(', тогда возникает ошибка.
  • Если вы прочитали весь ввод и ваш стек не пуст, выдайте ошибку.
person peter.petrov    schedule 03.03.2014
comment
Этот алгоритм никогда не будет помещать в стек ничего, кроме (, так что, возможно, его можно значительно упростить? --- но теперь я вижу, что они должны использовать стеки. - person ajb; 04.03.2014
comment
@ajb Да, этого не будет, и это нормально. - person peter.petrov; 04.03.2014