Java 查找不匹配括号的索引
我必须(用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] 解决这个问题的正确算法是什么?您可以 从左到右,检查每个字符 如果它是一个打开的文件,则将其添加到堆栈中。将此号码添加到列表中 如果是闭括号,则从堆
Input: ”d(f(b)())o”
Return:[]
Input: ”**)**(d(f(b)())) **)** o **(**”
Return:[0, 12, 14]
解决这个问题的正确算法是什么?您可以
您可以有两个列表,一个处理开括号,另一个处理闭括号。这将使删除索引更容易。
堆栈实际上非常适合括号匹配。在伪代码中,它看起来像
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
)。