2015-03-18 2 views
0

Так что я написал этот код, чтобы определить, является ли выражение уравнял скобку в стеке:Как определить, имеет ли выражение сбалансированные скобки в стеке?

public static boolean isBalanced(String expr) { 
    StringStack stack = new StringStackRefBased(); 
    try{ 
    for (int i = 0; i<expr.length(); i++){ 
     if (expr.charAt(i) == ('(')){ 
      stack.push("("); 
     } else if (expr.charAt(i) == (')')){ 
      stack.pop(); 
     } 
    } 
    if (stack.isEmpty()){ 
     return true; 
     } else { 
      return false; 
     } 
    } catch (StringStackException e) { 
     return false; 
    } 
} 

Проблема заключается в том, что стопка держит на возвращении ложных, даже если выражение сбалансированных скобок, что случилось с моим кодом?
Вот код для StringStackRefBased

public class StringStackRefBased implements StringStack { 
    private StringNode head; 

    public boolean isEmpty(){ 
     return head == null; 
    } 

    public void push(String item) throws StringStackException{ 
     head = new StringNode(item); 
    } 

    public String pop() throws StringStackException{ 
     String result = null; 
     if(isEmpty()){ 
      throw new StringStackException("Empty Stack"); 
     } 
     head.next = head; 
     return head.toString(); 
    } 

    public String peek() throws StringStackException{ 
     if (isEmpty()){ 
      throw new StringStackException("Stack underflow"); 
     } 
     return head.toString(); 
    } 
} 
+0

Ну StringStack не так уж много в нем, но StringStackRefBased имеет все методы в нем. Я обновил код, чтобы показать StringStackRefBased. Самое большое, что мне интересно, это правильные методы push и pop? –

+0

Почему бы просто не иметь int и делать 'count ++' и 'count -'? Затем в конце вы можете проверить, равно ли счету. – Bubletan

+1

Проблема заключается в вашем 'StringStack', потому что, если я заменил его на встроенный' Stack' Java, он будет работать отлично. –

ответ

3

Метод отлично. Если я использую собственный стек в Java:

class Main { 

    public static boolean isBalanced(String expr) { 
    Stack<String> stack = new Stack<>(); 
    try{ 
     for (int i = 0; i<expr.length(); i++){ 
     if (expr.charAt(i) == ('(')){ 
      stack.push("("); 
     } else if (expr.charAt(i) == (')')){ 
      stack.pop(); 
     } 
     } 
     if (stack.isEmpty()){ 
     return true; 
     } else { 
     return false; 
     } 
    } catch (Exception e) { 
     return false; 
    } 
    } 

    public static void main(String[] args) { 
    System.out.println(isBalanced("(")); 
    System.out.println(isBalanced("(()")); 
    System.out.println(isBalanced("())")); 
    System.out.println(isBalanced("((()))")); 
    System.out.println(isBalanced("(()())")); 
    } 
} 

напечатает:

false 
false 
false 
true 
true

Btw, ваше возвращение заявление довольно многословен, и используя исключение таким образом это плохая практика. Исключения составляют только: исключение (в любом случае). Это ИМО лучше:

public static boolean isBalanced(String expr) { 
    Stack<String> stack = new Stack<>(); 

    for (int i = 0; i < expr.length(); i++) { 
    if (expr.charAt(i) == ('(')){ 
     stack.push("("); 
    } 
    else if (expr.charAt(i) == (')')) { 
     if (stack.isEmpty()) { 
     return false; 
     } 
     stack.pop(); 
    } 
    } 

    return stack.isEmpty(); 
} 

Это, как ваш стек будет работать должным образом:

class StringStack { 

    private StringNode head = null; 

    public boolean isEmpty(){ 
    return head == null; 
    } 

    public void push(String item) { 
    StringNode oldHead = head; 
    head = new StringNode(item); 
    head.next = oldHead; 
    } 

    public String pop() throws StringStackException { 
    if (isEmpty()) { 
     throw new StringStackException("Empty Stack"); 
    } 
    String result = head.item; 
    head = head.next; 
    return result; 
    } 

    public String peek() throws StringStackException { 
    if (isEmpty()) { 
     throw new StringStackException("Stack underflow"); 
    } 
    return head.item; 
    } 

    static class StringNode { 

    String item; 
    StringNode next; 

    public StringNode(String item) { 
     this.item = item; 
    } 
    } 
} 
+0

@GriffeyDog, вопрос о его методе (логика позади него), что просто отлично. Я просто показал ему, что ему нужно посмотреть на его стек. Если он предоставит (полный) источник для своего стека, я с удовольствием предоставим информацию в своем ответе на него. –

+0

Да, я знаю. Опять же, если он предоставит полный источник этого класса, я более чем счастлив отредактировать свой ответ с дополнительной информацией (если кто-то из esle не делает этого передо мной). –

+0

Прежде всего проблема заключается в том, что мои методы push и pop не работают правильно, и я не уверен, как их исправить. Для push я пытаюсь установить старую голову на предыдущий узел и продолжать увеличивать размер стека. –