2013-12-05 2 views
0

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

Если для каждого «)» есть «(» то это сбалансировано. Если есть «)» без «(» тогда левых скобок не хватает, и так далее.

я выработал код для случая «(A + B)», и он печатает сбалансированный, но для случая «(A + B))» он печатает «Сбалансированные и левые», и я не могу понять, что проблема

вот код: (EDIT: Я разработал его как метод, он отлично работает, когда выражение сбалансировано и когда правая скобка отсутствует, но если левая отсутствует, выдается «сбалансированная»). Проблема когда он имеет отсутствующую левую скобку, возвращенный стек пуст, поэтому он печатает «сбалансированный». Я действительно не знаю, как исправить этот случай!

public static Stack isBalanced(String str) { 

    Stack s = new Stack(); 
    char temp; 

    for (int i = 0; i < str.length(); i++) { 
     if (str.charAt(i) == '(') { 
      s.push(str.charAt(i)); 
     } else if (str.charAt(i) == ')') { 
       if (!s.isEmpty()) { 
       temp = (char) s.pop(); 
      } 
     } 
    } 
    return s; 
} 
+1

Что вам удалось сделать с помощью отладчика? –

+1

@ RossDrew - рассмотрите, пожалуйста, вопрос об устранении вашего ответа. Конечно, это не идеально, но его легко исправить. –

+0

Отладчик - ваш друг, но ... вы увидите, что вы повторите свои проверки для своего персонажа. Сначала «)» будет печатать «сбалансированный», второй будет печатать «left missing». Сделайте эту проверку НА КОНЕЦ. В цикле вам просто нужно их подсчитать (+1 для "(" и -1 для ")"). ** Результат этого счета должен быть равен нулю, а во время цикла он не может быть <0. ** –

ответ

3

Вы проверки, является ли стек isEmpty каждый раз, когда вы сталкиваетесь с ) и печать «Сбалансированный» первый раз, когда ваш счетчик опустится до нуля. Вы должны только сделать эту проверку в самом конце (и вам также нужно убедиться, что вы никогда не видели, чтобы стек был поврежден).

+0

Что вы подразумеваете под словом "stack underrun"? и по вашему ответу вы указываете, что я должен сделать чек на «)» в качестве последней проверки? – Scarl

+0

@P. 성미 Я имею в виду, что если вы получите закрывающую круглую скобку, которая еще не имеет соответствующего открытия, вы должны немедленно пометить это выражение как плохое (установить логический флаг, break, return, whatever). – chrylis

+0

правый..это имеет смысл! Благодаря! – Scarl

6

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

Просто сканируйте строку, проверяя каждый символ. Увеличивайте счетчик на каждом (, уменьшайте его на каждом).

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

+0

+1. Очень хорошо. Лучше всего. –

+0

Это не отвечает на то, что не так с кодом OP, просто дает решение ... –

+0

+1 Сам стек, используемый OP, является не чем иным, как унарным счетчиком. Он представляет собой целое число через счетчик '(' s в стеке. –

0

Я решил проблему, в конце концов, у меня было только 1 условие, проверяющее, не стекал ли стек, и я не ставил условие, когда стек не был пустым, поэтому, если стек произошел быть пустым я подтолкну закрывающие скобки в него и в основном соответствующее сообщение будет напечатано (я забыл добавить свою мм в коде выше)

 if (!s.isEmpty()) { 
      temp = (char) s.pop(); 
     }else{ 
     s.push(str.charAt(i)); 
    } 

Тогда в мм я проверяю ли мой вернулся стек пуст или нет, и распечатайте правильную отправку сообщений (сбалансированное - оставлено слева - отсутствует)

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