Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归字符串到树解析器_Java_String_Algorithm_Arraylist_Tree - Fatal编程技术网

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