Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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_Algorithm_Data Structures_Stack - Fatal编程技术网

Java 查找不匹配括号的索引

Java 查找不匹配括号的索引,java,algorithm,data-structures,stack,Java,Algorithm,Data Structures,Stack,我必须(用Java编写,但语言并不重要)一个函数,它接受一个括号表达式(作为字符串)作为输入,并返回所有不匹配括号的索引集合 该函数只能使用堆栈作为辅助数据结构 例如: Input: ”d(f(b)())o” Return:[] Input: ”**)**(d(f(b)())) **)** o **(**” Return:[0, 12, 14] 解决这个问题的正确算法是什么?您可以 从左到右,检查每个字符 如果它是一个打开的文件,则将其添加到堆栈中。将此号码添加到列表中 如果是闭括号,则从堆

我必须(用Java编写,但语言并不重要)一个函数,它接受一个括号表达式(作为字符串)作为输入,并返回所有不匹配括号的索引集合

该函数只能使用堆栈作为辅助数据结构

例如:

Input: ”d(f(b)())o”
Return:[]

Input: ”**)**(d(f(b)())) **)** o **(**”
Return:[0, 12, 14]
解决这个问题的正确算法是什么?

您可以

  • 从左到右,检查每个字符
  • 如果它是一个打开的文件,则将其添加到堆栈中。将此号码添加到列表中
  • 如果是闭括号,则从堆栈中弹出。如果无法弹出,则将当前字符索引添加到列表中
  • 如果可以弹出,则从开括号列表中删除最后一个索引
  • 重复步骤2和3,直到完成

  • 您可以有两个列表,一个处理开括号,另一个处理闭括号。这将使删除索引更容易。

    堆栈实际上非常适合括号匹配。在伪代码中,它看起来像

    indices = []
    
    for i->0, i<length(string), i++ do
    
        if string[i] == "(" then
            stack.push("(")
            indexStack.push(i)
    
        else if string[i] == ")" then
            if stack.size() < 1 then
                indices.append(i)
            else
                stack.pop()
                indexStack.pop()
    
    while indexStack.size() > 0 do
         indices.append(indexStack.pop())
    
    索引=[]
    对于i->0,我0做
    index.append(indexStack.pop())
    
    至于如何解释这一点

    • 遍历字符串
    • 如果
      char
      是打开的paren,则将其推到堆栈上
    • 如果
      char
      是一个关闭的paren,请检查堆栈上是否有任何打开的paren
    • 如果有一个打开的paren,从堆栈中弹出它(我们找到了匹配项);如果不是,我们有一个不匹配的paren记录索引
    • 最后,如果堆栈中还有任何参数,则它们是不匹配的,弹出索引关闭
      indexStack

    编辑:抱歉,未处理不匹配的打开参数

    6。将堆栈上剩余的所有内容都添加到列表中。我没有尝试过,但是如果没有堆栈,您不能执行相同的操作吗?由于堆栈只包含打开的paren,似乎只有一个计数器可以工作。@Dukeling:步骤2和步骤3不应该解决这个问题吗?@JoeF:我认为在这种情况下您是对的,但是,如果需要内存服务堆栈,因为这通常是通过最终状态自动机完成的。我认为您的语句4存在逻辑错误。它应该删除最末端的索引(最近的被推送的paren),因为这是紧密paren要匹配的索引。所以解决这个问题的唯一方法是,除了堆栈之外,使用另一个any结构(作为数组)?如果要返回所有不匹配paren的索引,那么是,您需要像数组这样的东西来存储它们。如果您想要第一个不匹配的或是/否它是不匹配的,您可以在不使用阵列的情况下执行。不过,您可以使用堆栈作为存储信息的可怕方式。在我的回答中,无论您在哪里看到
    index.append()
    替换为
    outputStack.push()
    。这样,所有值仍然存储在堆栈中(
    outputStack
    )。