Java рекурсивные подходящие скобки из txt - PullRequest
0 голосов
/ 29 марта 2020

У меня проблема с моим кодом, не могли бы вы помочь мне, пожалуйста, с этим .. Я хочу сделать рекурсию Соответствие скобкам при чтении из txt .. Это мой класс, поэтому мне нужна помощь с кодом, если это возможно, спасибо слишком много

import java.util.*;
import java.io.*;

public class MatchBrackets
{
    public static void main(String [] args) throws FileNotFoundException
    {

     boolean answer;
     String st;
     Scanner infile = new Scanner (new FileReader("MatchExpression.txt"));
     PrintWriter outFile = new PrintWriter ("MatchResults.txt");
     while (infile.hasNext())
     {
     st = infile.nextLine();
     outFile.println("Expression #" + ": " + st);

     answer = matchBrackets(st);
     if(answer == true)
     outFile.println( " Invalid Expression \n");
     else
     outFile.println( " The value of this expression is: "
     + answer);
     outFile.println(); outFile.println();
     }
     infile.close();
     outFile.close();
    }

    public static boolean matchBrackets (String str)
    {
     ArrayStack S = new ArrayStack(100);
     char ch;
     if ((str == null) || str.isEmpty()) {
         return str.isEmpty();
     }
     else {
     ch=str.charAt(0);
     if(ch=='{' || ch=='(' ||ch=='[' )
     { S.push(ch); }
     else if (ch=='}' || ch==')' ||ch==']' ){
     if(S.isEmpty())
     return false;
     switch(S.pop()){
     case '{': if(ch!='}') return false; break;
     case '[': if(ch!=']') return false; break;
     case '(': if(ch!=')') return false; break;
     }
     }
     return matchBrackets(str);
   }
    }
}

И ArrayStack, включая POP, PU SH, isEmpty ... et c

1 Ответ

0 голосов
/ 01 апреля 2020

Так вот в чем проблема, каждый рекурсивный вызов, который вы делаете:

ArrayStack S = new ArrayStack(100);

, что означает, что при каждом вызове вы создаете совершенно новый стек. Поэтому вы можете захотеть создать новый стек для каждой строки, которую вы читаете из файла, и просто передать этот стек своей функции.

Вот мое решение. Я предполагал, что некоторые фиктивные тестовые строки вместо чтения из файла, это в основном то же самое. Просто для проверки функции.

public class Main {

    public static void main(String[] args) {
        // test string
        String [] tests = {"[][][]{}()", ")(()){([()])}", "((()(()){([()])}", "({[]}){[]}()"};

        for (int i =0; i < 4; i++) {
            Stack<Character> stack = new Stack<>();
            System.out.println(matchBrackets(stack, tests[i], 0));
        }
    }

    private static boolean matchBrackets(Stack<Character> stack, String str, int i) {
        // if we reached the end of the string, then check if stack is empty or not
        if (i == str.length() && !stack.isEmpty()) return false;
        else if (i == str.length() && stack.isEmpty()) return true;

        if (str.charAt(i) == '(' || str.charAt(i) == '{' || str.charAt(i) == '['){
            stack.push(str.charAt(i));
            return matchBrackets(stack,str,++i);
        }  else {
            // if stack is empty, then the expression is false
            if (stack.isEmpty()) return false;
            char c = stack.pop();
            if ( (str.charAt(i) == '}' && c != '{') && (str.charAt(i) == ']' && c != '[') && (str.charAt(i) == ')' && c != '(') ) {
                return false;
            } else {
                return matchBrackets(stack,str,++i);
            }
        }
     }
}

Примечание. Вы можете, например, очистить стек для каждого выражения вместо его повторной инициализации.

...