Java 平衡检查是否使用堆栈在字符串中关闭括号

Java 平衡检查是否使用堆栈在字符串中关闭括号,java,Java,我正在编写一个程序,检查用户输入的字符串中是否有括号集是闭合的,但我不知道该怎么做,因为我们需要使用堆栈来完成它 我的想法是将括号添加到堆栈中(如果存在),然后如果出现一个结束括号,从堆栈中弹出顶部的两个字符,如果第二个弹出字符与第一个匹配(如括号类型匹配,它同时是一个开始括号和结束括号),则行是平衡的。但是,我需要让它能够处理包含多个括号和字符的字符串,例如: wfsfs[{{{(s;dkls(dslkf)s;dlkf}]}]}}}sd 我真的很困惑如何使用堆栈来实现这一点!有什么想法吗

我正在编写一个程序,检查用户输入的字符串中是否有括号集是闭合的,但我不知道该怎么做,因为我们需要使用堆栈来完成它

我的想法是将括号添加到堆栈中(如果存在),然后如果出现一个结束括号,从堆栈中弹出顶部的两个字符,如果第二个弹出字符与第一个匹配(如括号类型匹配,它同时是一个开始括号和结束括号),则行是平衡的。但是,我需要让它能够处理包含多个括号和字符的字符串,例如:

 wfsfs[{{{(s;dkls(dslkf)s;dlkf}]}]}}}sd
我真的很困惑如何使用堆栈来实现这一点!有什么想法吗

这里基本上是我到目前为止提出的代码,但它不适用于多个括号

    for (int i = 0; i < x.length(); i++){
        if (x.charAt(i) == '('){
            stack.push('('); 
            }
        if (x.charAt(i) == '['){
            stack.push('(');
            }
        if (x.charAt(i) == '{'){
            stack.push('(');
            }
        if (x.charAt(i) == ')'){
            stack.pop(); 
            if (stack.empty()){
                return true; 
                }
            if (stack.pop() != ')'){
                return true;
                }
            }
        if (x.charAt(i) == ']'){
            stack.pop(); 
            if (stack.empty()){
                return true; 
                }
            if (stack.pop() != ']'){
                return true;
                }
            }
        if (x.charAt(i) == '}'){
            stack.pop(); 
            if (stack.empty()){
                return true; 
                }
            if (stack.pop() != '}'){
                return true;
                }
            }

    }

    return false;
}


}
for(int i=0;i

编辑:“x”是一个输入的句子,这是我的想法。你可以把一个开括号推到堆栈上(只有当你有一个开括号时才推),然后在有结束括号时弹出。如果由于堆栈上没有任何内容而无法弹出,则测试失败。如果到达末尾且堆栈上有内容,则测试失败

如果它们必须配对(即{{{}{}}{}}是失败而不是成功),这会变得更困难,但如果再次推,则可以跟踪一旦开始弹出的情况,如果失败

编辑:如果必须匹配三种“括号”(技术上有括号、花括号和括号)中的一种,则可以有三个不同的堆栈,或者使用peek验证堆栈上的顶部“括号”是否与结束的“括号”匹配

EDIT2:要显示伪代码示例,请执行以下操作:

我有一个字符串:“[[]”

通过扫描字符串,我看到我的第一个字符是一个开括号[I pop this to my stack,使我的stack 1项目变大,上面有“[”

我的下一个字符也是一个开括号,所以我也把它放在堆栈上,这意味着我的堆栈上有两个项目,['和['

第三个字符是一个闭括号。我查看堆栈顶部,发现它与那里的开放括号匹配,所以我将开放括号从堆栈中弹出,在堆栈上留下一个开放括号“[”

我的第四个字符是一个封闭的括号。我查看堆栈顶部,发现它与堆栈上的开放括号匹配。我将此括号从堆栈中弹出,留下一个空堆栈

我结束了我的字符串,看到我有一个空堆栈,所以这个过程通过了

Edit3:使用不同括号的示例

假设我有一个字符串:“[{(){}}]”

我的第一个字符是“[”,因此我将其弹出到堆栈中

我的第二个字符是“{”,所以我把它放到堆栈上

我的第三个字符是“(”所以我把它放到堆栈上

我的第四个字符是“'),所以我用peek检查堆栈的顶部。它是一个匹配的paren'('所以我把它从堆栈中弹出并继续

我的第五个字符是“{”,所以我把它放在堆栈上

我的第六个字符是“}”,所以我在堆栈的顶部查看,看到一个匹配的“{”,然后将其从堆栈中弹出

我的第七个字符是“}”,因此我查看堆栈顶部,看到匹配的“{”,然后将其从堆栈中弹出

我的八个字符是']',所以我看了看堆栈的顶部,发现它是一个匹配的']',所以我把它从堆栈中弹出


我到了绳子的末端,我的堆栈上什么都没有了,所以我很好,案例通过了。

哦,嗯,现在我想也许我可以有单独的堆栈,然后测量每个堆栈中的项目数量,如果它平均除以两,那么它就是一个传递。不一定,你想使用推和弹出机制。我可以{{{{如果我只检查除以2就可以了哦,你说得对,很好。嗯,但是如果这个系列是[[]]之类的,我怎么才能让推和弹出工作呢如果我弹出最上面的一个,它将不是一个匹配的括号?我是否只需要为每一组新的括号制作一个全新的堆栈,并计算剩余的堆栈数?哦,很抱歉我以前误解了,你的编辑澄清了,我会试一试!谢谢!