gpt4 book ai didi

Java递归匹配txt中的括号

转载 作者:行者123 更新时间:2023-12-01 17:43:21 25 4
gpt4 key购买 nike

我的代码有问题,你能帮我解决这个问题吗..我想进行递归匹配从 txt 读取的括号..这是我的类(class),所以如果可能的话,我需要代码方面的帮助,非常感谢

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 ...等

最佳答案

所以这就是问题所在,您所做的每次递归调用:

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);
}
}
}
}

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

关于Java递归匹配txt中的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com