2

式のバランスが取れているかどうかをテストする 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;
    }
}
4

4 に答える 4

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

二重バックスラッシュは特殊文字であるため、各括弧をエスケープするために使用されます

于 2016-03-11T08:38:47.267 に答える
0

この部分は間違っています:

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

2 つの文字が等しいかどうかをチェックしますが、正しいチェックでは、対応する 2 つの文字[- ](- )、および{-と一致する必要があります。}

于 2016-03-11T08:26:44.303 に答える
-1
#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");
}
}
于 2017-08-09T08:05:40.157 に答える