使用Stack检查括号是否平衡?

时间:2016-03-11 08:17:37

标签: java stack expression parentheses balance

我编写了一个java代码来测试表达式是否平衡,也就是说,该程序检查字符'(','{'和'['是否有相应的分隔符。但是我无法得到所需的答案。有些问题,我无法弄明白,因此需要你的帮助。这是代码。

package z_Stack_InfixToPostfix;
import java.util.Stack;

public class Driver_InfixToPostfix {

    public static void main(String[] args) {
        String s="(a+b)";
        System.out.println(checkBalance(s));
    }

    public static boolean checkBalance(String expression){
        boolean isBalanced=true;
        Stack<Character> myStack=new Stack<Character>();
        int length=expression.length();
        int i=0;
        while(isBalanced && i<length){
            switch(expression.charAt(i)){
            case '(': case '{': case '[' :
                myStack.push(expression.charAt(i));
                break;
            case ')': case '}': case ']':
                if(myStack.isEmpty()){
                    isBalanced=false;
                }
                else{
                    char opendelimiter=myStack.pop();
                    if(opendelimiter!=expression.charAt(i)){
                        isBalanced=false;
                    }
                }
                break;
            }
            i++;
        }
        if(!myStack.isEmpty()){
            isBalanced=false;
        }
        return isBalanced;
    }
}

5 个答案:

答案 0 :(得分:1)

char opendelimiter=myStack.pop();
if(opendelimiter!=expression.charAt(i)){
       isBalanced=false;
}

在这里你应该检查

    if(openedDeimilter == '('){
        if(expression.charAt(i)!=')'){
            isBalanced=false;
            //break;
        }
    }else if(openedDeimilter == '['){
        if(expression.charAt(i)!=']'){
           isBalanced=false;
           //break;
        }
    }else {
         if(expression.charAt(i)!='}'){
            isBalanced=false;
            //break;
        }
    }

一旦isBalanced设置为false,您可以跳过迭代剩余的字符串,如果它适合您。

答案 1 :(得分:1)

如果不使用每个括号只使用表达式的长度,那么不同的方法呢?这将使您不使用Stack类,并且对于更长的表达式应该更有效

public static boolean checkBalance(String expression) {
   String[] parentheses = new String[]{"\\(|\\)","\\[|\\]","\\{|\\}"};
   int length = expression.length();
   for(int i=0; i<parentheses.length; i++) {
       int newLength = expression.replaceAll(parentheses[i], "").length();
       int diff = length - newLength;
       if(diff % 2 != 0) {
          return false;
       }
   }
   return true;
}

双反斜杠用于转义每个括号,因为它们是特殊字符

答案 2 :(得分:0)

这部分错了:

if(opendelimiter!=expression.charAt(i)){
    isBalanced=false;
}

你检查两个字符是否相等,但正确的检查应该与2个相应的字符匹配:[ - ]( - )和{{1} } - {

答案 3 :(得分:0)

在第二个案例陈述中,你要比较“(”和“)”,那将永远是假的,你的布尔也是。

所以你必须比较正确的相应角色!

答案 4 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


char exp[1028];
char ext[1028];

int top = -1;
//-----------------------------------------------------------------------------
push(char x){

    top++;
    ext[top]=x;
    }
//-----------------------------------------------------------------------------------------

void pop(){
    top--;
}
//--------------------------------------------------------------------------------------


main()
{
int ans;
char in='{';
char it='[';
char ie='(';

char an;'}';
char at=']';
char ae=')';
printf("\nenter your expression\n");
gets(exp);
int j=strlen(exp);
int i;
for(i=0;i<=j;i++){
    if(exp[i] == in || exp[i] == it || exp[i]==ie){
        push(exp[i]);
        }
    if(exp[i] == an ||exp[i]== at || exp[i]==ae){
        pop();
    }
}
if(top == -1){
    printf("\nexp is balanced\n");
    }
else{
    printf("\nexp is unbalanced");
}
}