txt的Java递归匹配括号

我的代码有问题,请您帮我一个忙.. 我想进行递归从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,PUSH,isEmpty ...等等

guozhijun0512 回答:txt的Java递归匹配括号

这就是问题,您执行的每个递归调用

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,++i);
            }
        }
     }
}

注意:例如,您实际上可以清除每个表达式的堆栈,而不必重新初始化它。

本文链接:https://www.f2er.com/2560171.html

大家都在问