2014-11-04 1 views
0

Я сделал программу проверки скобок в Java, которая читает в текстовом потоке со стандартного ввода и использует стек, чтобы определить, правильно ли сбалансированы его круглые скобки. Например, он должен напечатать true для [()]{}{[()()]()} и false для [(]). Я сделал стек класс моего для решения этой проблемы:Контроллер скобок в java

public class Stack { 
private char items[]; 
private int top; 

Stack(int n){ 
    items = new char[n]; 
    top = -1; 
} 

void push(char c){ 
    if(top == items.length-1){ 
     System.out.println("Stack full."); 
     return; 
    } 
    top++; 
    items[top] = c; 
} 

char pop(){ 
    if(isEmpty()){ 
     System.out.println("Stack empty"); 
     return (char)0; 
    } 
    char p; 
    p = items[top]; 
    top--; 
    return p; 
} 

boolean isEmpty(){ 
    if(top == -1) 
     return true; 
    else  
     return false; 
} 

}

Метод checkValid ниже принимает входную строку и возвращает истину, если совпадение скобки, и ложно, если они не совпадают.

public static Boolean checkValid(String str){ 
     char sym,prev; 
     Stack s = new Stack(str.length()); 
     for(int i=0; i<str.length();i++){ 
      sym = str.charAt(i); 
      if(sym == '(' || sym=='{' || sym=='['){ 
       s.push(sym); 
      } 
      if(sym == ')' || sym=='}' || sym==']'){ 
       if(s.isEmpty()){ 
        return false; 
       } 
       else{ 
        prev = s.pop(); 
        if(!isPairMatch(prev,sym)) 
         return false; 
       } 
      } 

     } 
     if(!s.isEmpty()) 
      return false; 
     return true; 
    } 
    public static boolean isPairMatch(char character1, char character2){ 
     if(character1 == '(' && character2 == ')') 
      return true; 
     else if(character1 == '{' && character2 == '}') 
      return true; 
     else if(character1 == '[' && character2 == ']') 
      return true; 
     else 
      return false; 
    } 
} 

Есть ли способ распечатать позицию непревзойденных круглых скобок?

+0

Ну, положение несогласованных круглых скобок должно быть таким же, как размер стека (или «размер - 1»). – Tom

ответ

1

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

EDIT:

Это решение только если вы хотите, показатели обоих несогласованных скобках, что не прошли тест isPairMatch.

Например, если у вас есть строка "[{} {} {})", то пара, которая не совпадает, является первой "[" и последней ")", индексы которой равны 0 и 7.

Если вам нужен только индекс первой несогласованной скобки (т. Е. Первый «[», индекс которой равен 0), вы просто проверяете размер стека после удаления этой скобки. В этом примере стек будет пустым при проверке последней пары, поэтому размер стека будет равен 0, что является индексом первого символа неудачного теста isPairMatch.

+0

Тогда программа сможет проверить, есть ли правильная закрывающая скобка для определенного открытия? – rick112358

+0

вам нужна карта где k - индекс, v - значение, то есть скобка. – ha9u63ar

+0

@ rick112358 Ваш алгоритм останется прежним. Единственное различие заключалось бы в том, что вместо (например) нажатия «{» в стек, вы должны нажать новый элемент ('{', 4). 'isPairMatch' получит два элемента вместо двух символов, и если пара символов, хранящихся в этих элементах, не соответствует, вы можете распечатать индексы этих символов. – Eran