Java 递归字符串到树解析器
目前,我正在尝试实现一个递归解决方案来构建一个树结构,例如,我已经将字符串拆分Java 递归字符串到树解析器,java,string,algorithm,arraylist,tree,Java,String,Algorithm,Arraylist,Tree,目前,我正在尝试实现一个递归解决方案来构建一个树结构,例如,我已经将字符串拆分 input: "(3 + 5)" Output: [1, 3], [1, +], [1, 5] input: "3 + 5" Output [0, 3], [0, +], [0, 5] 这是为了表示带括号的开放表达式(第一个输出) 和完整表达式(第二个输出)。我对如何递归调用它有点困惑(并且睡眠不足),所以如果输入大得多,它会继续创建子树吗?有什么想法吗?或指向文档的链接:) 公共节点parseStringToT
input: "(3 + 5)"
Output: [1, 3], [1, +], [1, 5]
input: "3 + 5"
Output [0, 3], [0, +], [0, 5]
这是为了表示带括号的开放表达式(第一个输出)
和完整表达式(第二个输出)。我对如何递归调用它有点困惑(并且睡眠不足),所以如果输入大得多,它会继续创建子树吗?有什么想法吗?或指向文档的链接:)
公共节点parseStringToTree(字符串str)
{
str=str.replaceAll(“,”);
ArrayList chars=新的ArrayList();
ArrayList深度=新的ArrayList();
int openCount=0;
int openClose=0;
对于(int i=0;i
如何在输出中获得这些1?查看看起来像嵌套深度的代码。通过跟踪打开的括号-其中该语句int currentDepth=openCount-openClose;如果处于当前“平衡”状态,则应等于0。如果在没有打开的情况下找到一个结束括号,它应该返回-1或者抛出一个错误,但是我还没有到那个阶段,如果你想象你在字符串的中间,你的递归方法被调用,通常需要帮助:你需要什么信息,需要什么信息返回到调用方?在本例中,函数至少需要字符串中的当前位置(可能在左括号后面)和当前深度。它需要返回它生成的子树和它完成工作的字符串位置(在匹配的右括号之后)。或者,如果找不到,它应该抛出一个异常。然后继续创建一个框架实现:确定要用什么格式表示树(它可能是一个递归结构,尽管它可以像列表一样简单)。然后继续递归解析器,忽略不是(
或)
的每个字符。作为最后一步,您可以添加递归方法的“主体”,它会解析所有其他内容,直到它碰到一个开始或结束的括号。如何在输出中得到这些1?查看看起来像嵌套深度的代码。通过跟踪打开的括号-其中该语句int currentDepth=openCount-openClose;如果处于当前“平衡”状态,则应等于0。如果在没有打开的情况下找到一个结束括号,它应该返回-1或者抛出一个错误,但是我还没有到那个阶段,如果你想象你在字符串的中间,你的递归方法被调用,通常需要帮助:你需要什么信息,需要什么信息返回到调用方?在本例中,函数至少需要字符串中的当前位置(可能在左括号后面)和当前深度。它需要返回它生成的子树和它完成工作的字符串位置(在匹配的右括号之后)。或者,如果找不到,它应该抛出一个异常。然后继续创建一个框架实现:确定要用什么格式表示树(它可能是一个递归结构,尽管它可以像列表一样简单)。然后继续递归解析器,忽略不是(
或)
的每个字符。作为最后一步,您可以添加递归方法的“主体”,它解析所有其他内容,直到它碰到一个左括号或右括号。
public Node parseStringToTree(String str)
{
str = str.replaceAll(" ", "");
ArrayList<Character> chars = new ArrayList<Character>();
ArrayList<Integer> depths = new ArrayList<Integer>();
int openCount = 0;
int openClose = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '(') {
openCount++;
} else if (c == ')') {
openClose++;
} else {
int currentDepth = openCount - openClose;
chars.add(c);
depths.add(currentDepth);
}
}
for (int i = 0; i < chars.size(); i++) {
int depth = depths.get(i);
char c = chars.get(i);
System.out.println("[" + depth + ", " + c + "]");
}
return root;
}