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

时间:2014-04-23 00:28:16

标签: java

我正在编写一个程序来检查是否在用户输入的字符串中关闭括号组,但我对如何操作感到困惑,因为我们需要使用堆栈来完成它。

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

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


}

编辑:&#34; x&#34;是一个有争议的句子

1 个答案:

答案 0 :(得分:0)

所以,这是我的想法。你可以将一个打开的支架推到堆叠上(只有当你有一个打开的支架时才推动),然后只要你有一个右括号就弹出。如果由于堆栈中没有任何内容而无法弹出,则测试失败。如果你到达最后并且堆栈上有东西,那么测试就会失败。

如果必须配对,这会变得更加困难(即{{} {} {}}失败并不成功),但是如果你再次推动,你可以跟踪一旦你开始弹出失败。

编辑:如果你必须匹配三种“括号”中的一种(技术上你有括号,花括号和圆括号)那么你可以有三个不同的堆栈,或者通过窥视验证顶部的“括号”堆栈与结束堆栈匹配。

EDIT2:显示伪代码示例:

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

通过字符串扫描,我看到我的第一个字符是一个开放式括号[我将它弹出到我的堆栈中,使我的堆栈1项大,上面带有'['。

我的下一个角色也是一个开放式括号,所以我也将它弹出到堆栈中,这意味着我的堆栈中有2个项目,'['和'['

第三个字符是一个封闭的括号。我偷看了我的堆栈顶部,看到它与那里的开放式支架相匹配,所以我从堆栈中弹出开放式支架,让我在堆栈上留下一个开放式支架'['

我的第四个角色是一个封闭的括号。我偷看了我的堆栈顶部,发现它与堆栈上的开放式支架相匹配。我从支架上弹出这个支架,留下一个空的堆栈。

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

Edit3:带有不同括号的示例。

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

我的第一个角色是'['所以我把它弹到堆栈上

我的第二个字符是'{'所以我把它弹到堆栈

我的第三个字符是'('所以我把它弹到堆栈

我的第四个角色是')',所以我偷看了堆栈的顶部。它是一个匹配的paren'('所以我把它从堆栈中弹出并继续前进。

我的第五个字符是'{'所以我将其弹出堆栈。

我的第六个角色是'}'所以我偷看了我的堆栈顶部,看到匹配的'{'并将其从堆栈中弹出。

我的第七个角色是'}'所以我偷看了堆叠的顶部,看到匹配的'{'所以我把它从堆栈中弹出。

我的八个字符是']'所以我偷看我的堆栈的顶部并看到它是匹配的']'所以我把它从堆栈中弹出。

我到达了我的字符串的末尾并且我的堆栈上没有任何东西,所以我很好,并且案件通过了。