Как определить, есть ли в тексте сбалансированные разделители?

У меня есть этот вопрос,

Напишите функцию, которая определяет, есть ли в тексте сбалансированные разделители. Допустимыми парами разделителей являются (), [], {} и ‹>. Они могут быть вложенными. Кроме того, убедитесь, что текстовые разделители ' и " соответствуют друг другу.

Я, кстати, кодирую на java..

Для каждой тестовой строки выводится «1», если она имеет сбалансированные разделители, и «0» в противном случае.

Пример ниже,

4 --- 0

{123} --- 1

{qweqwe{sdad} --- 0

Проблема в том, как я могу написать в java-коде, чтобы проверить, совпадают ли пары допустимых разделителей? Извините, я очень мало знаю о разделителях.

Ниже мой код..

public static void main(String args[]) {
        String a1 = "";
        try {
            Scanner readFile = new Scanner(new File("2.in.txt"));
            while (readFile.hasNextLine()) {

                a1 = readFile.nextLine();
                System.out.println(a1);
                if (a1.equals("18")) {
                    System.out.println("0");
                } else {
                    System.out.println("1");
                }
            }
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            return;
        }
    }

person Amazinglykai    schedule 23.07.2012    source источник


Ответы (2)


Взгляните на этот код, он решает аналогичную задачу.

import java.util.Stack;

class BracketChecker {
  private String input;

  public BracketChecker(String in) {
    input = in;
  }

  public void check() {
    Stack<Character> theStack = new Stack<Character>();

    for (int j = 0; j < input.length(); j++) {
      char ch = input.charAt(j);
      switch (ch) {
      case '{': 
      case '[':
      case '(':
        theStack.push(ch);
        break;
      case '}': 
      case ']':
      case ')':
        if (!theStack.isEmpty()) {
          char chx = theStack.pop();
          if ((ch == '}' && chx != '{') || (ch == ']' && chx != '[') || (ch == ')' && chx != '('))
            System.out.println("Error: " + ch + " at " + j);
        } else

          System.out.println("Error: " + ch + " at " + j);
        break;
      default:
        break;
      }
    }
    if (!theStack.isEmpty()){
      System.out.println("Error: missing right delimiter");
    }
  }
}

public class MainClass {
  public static void main(String[] args) {
    String input;
    input = "[]]()()";

    BracketChecker theChecker = new BracketChecker(input);
    theChecker.check();
  }

}
person dbf    schedule 23.07.2012

Общее решение этой проблемы — использование стека. Для каждой входной строки, начиная с пустого стека:

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

Когда вы закончите перебирать строку, проверьте, не пуст ли стек. Если да, верните true, иначе верните false.

В случае кавычек ' и ", если вы запрещаете кавычкам находиться внутри одной и той же кавычки и не учитываете escape-синтаксис, решение должно быть таким же.

person nhahtdh    schedule 23.07.2012
comment
Ага, помогло! но могу ли я подробнее рассказать об этих цитатах и ​​как проверить, совпадают ли эти цитаты? так же, как вещь, соответствующая скобке .. - person Amazinglykai; 23.07.2012
comment
@Amazinglykai: Разве я не говорил, что они будут одинаковыми (при некотором предположении)? В противном случае вам нужно будет тщательно определить, как следует выполнять побег. - person nhahtdh; 23.07.2012