2013-11-02 3 views
0

У меня есть определенная задача. У нас есть String как "(() [] <>)" или что-то знакомое с этим. Вопрос в моем интервью состоял в том, как проверить правильность или неправильность строки. Например: "() [] <>" - true, "([)" - false, "[(])" - false, "([<>])" - true. Спасибо вам, ребята! Я не могу понять, что не так с моим кодом. Спасибо, много парней !!! Пожалуйста, помогите!Как проверить строку, используя стек

импорт java.util.Stack;

общественного класса Test {

public static void main(String[] args) { 

    String line = "(<>()[])"; 
    Test test = new Test(); 
    boolean res = test.stringChecker(line); 
    System.out.println(res); 
} 

public boolean stringChecker(String line){ 
    boolean result = false; 
    char letter = '\u0000'; 
    char[] arr = line.toCharArray(); 
    Stack<Character> stack = new Stack(); 

    for (int i = 0; i < arr.length; i++) { 
     if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') { 
      stack.push(arr[i]); 
     } 
     if(arr[i] == ')' || arr[i] == ']' || arr[i] == '>'){ 
       if(stack.peek() == arr[i]){ 
        result = true; 
        stack.pop(); 

      } 
     } 
    } 

    return result; 
} 

}

+0

спасибо! – Sergey

ответ

2

(0) Вы подталкивают < (и {, но в вашем заглядывать вы проверка>), и}

(1) Вы начинаете с результата false и устанавливаете его в true в первом успешном матче. Вместо этого вы должны начать с результата true и установить его в false в первом неудачном совпадении.

(2) Вы должны проверить, что стек пуст, когда закончились символы.

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

(4) Возможно, вы захотите проверить символы, которые не ожидаются.

+0

Спасибо за ваше редактирование, к сожалению, я был АФК, поэтому я не мог его одобрить. Я отредактировал свой ответ, чтобы показать полный код, не стесняйтесь улучшать его снова! – A4L

0

В дополнение к объяснению @TheodoreNorvell «s вот как реализация может выглядеть

public boolean stringChecker(String input) { 
    boolean result = true; 
    char[] arr = input.toCharArray(); 
    Stack<Character> stack = new Stack<>(); 
    try { 
     for (int i = 0; result && i < arr.length; i++) { 
      if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') { 
       stack.push(arr[i]); 
      } else if(arr[i] == ')') { 
       Character c = stack.pop(); 
       result = c.equals('('); 
      } else if(arr[i] == ']') { 
       Character c = stack.pop(); 
       result = c.equals('['); 
      } else if(arr[i] == '>') { 
       Character c = stack.pop(); 
       result = c.equals('<'); 
      } else { 
       // found some char that is not allowed 
       // here it is not just ignored, 
       // it invalidates the input 
       result = false; 
      } 
     } 
     // when the teher is not more chars in the array 
     // the stack has to be empty 
     result = result && stack.isEmpty() ; 
    } catch(EmptyStackException e) { 
     // found a closing bracket in the array 
     // but there is nothing on the stack 
     result = false; 
    } 
    return result; 
} 

@Test 
public void stringChecker() { 
    Assert.assertTrue(stringChecker("[]")); 
    Assert.assertTrue(stringChecker("[(<>)]")); 
    Assert.assertFalse(stringChecker("([<>)]")); 
    Assert.assertFalse(stringChecker(">")); 
    // invalid char 
    Assert.assertFalse(stringChecker("<[]e>")); 
    // stack is not empty 
    Assert.assertFalse(stringChecker("(")); 
} 

Обратите внимание, что в такой ситуации switch-case заявление является более элегантным, чем if-else if-else.

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