でも、括弧などがある場合は、私の方法は、チェックするために、なぜ任意の理由が動作していませんか?

Gtown:

私はプログラムを作ったように{X +(Y - 2)×1}のように入力する方程式をユーザに尋ねるを扱っ+ [+のB]と確認する場合、すべての括弧やブラケットなどが閉じます。私の方法スポット場合、それは印刷する閉じること:式:{X +(Y - 2)×1} + [+のB] - >バランスされています。私の問題は、私の方法は、私は誰もがちょうど私の構文が間違っているなら、私に知らせてisBalanced method.Could以内にそのA問題があると思われるので、アンバランス毎回をデフォルトに思えるのですか?私がそれを読んだときにも流れているようです。ここに私のコードは次のとおりです。

import java.util.*;
import java.io.*;
public class BalancedParanthesis {
        static String expressions[];
        static class    MyArrayStack{
            int top = -1;
            char brackets[] = new char[100];
            void push(char x) {
                if(top ==99) {
                    System.out.print("Stack full");
                }
                else {
                    brackets[++top] = x;
                }
                }
            char pop() {
                if(top ==-1) {
                    System.out.println("ERROR:Stack undeflow error");
                    return '\0';
                }
                else {
                    char element = brackets[top];
                    top--;
                    return element; 
                }
            }

            boolean isEmpty() {
                return(top==-1)?true:false;
            }
        }
        static boolean isMatchingPair(char bracketOne,char bracketTwo) {
            if(bracketOne=='('&& bracketTwo ==')') {
                return true;
            }
            else if(bracketOne == '{'&& bracketTwo == '}') {
                return true;
            }
            else if(bracketOne == '['&& bracketTwo ==']') {
                return true;
            }
            else {
                return false;
            }

        }
        static boolean isBalanced(String expression) {
            MyArrayStack st =new MyArrayStack();
            for(int index = 0; index<expression.length();index++) {
                if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
                    st.push(expression.charAt(index));
                }
                if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
                        if(st.isEmpty()) {
                            return false;
                        }
                }
                else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
                    return false;
                }
            }
            if(st.isEmpty()) {
                return true;
            }
            else {
                return false;
            }
        }
        public static void main(String[] args) {
            System.out.println("Input: ");
            Scanner input = new Scanner(System.in);
            String x = input.next();
            if(isBalanced(x)) {
                System.out.println("\n Expression: " + x + " is balanced");
            }
            else {
                System.out.println("\n Expression: " + x + " is not balanced");
            }
        }

        }

アンドレアス:

コメント内の論理上の欠陥を参照してください。

// why are we checking for `{` twice here?
if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
    st.push(expression.charAt(index));
} // missing 'else' here, maybe??
// why are we checking for `}` twice here?
if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
    if(st.isEmpty()) {
        return false;
    }
    // shouldn't we be calling pop() and isMatchingPair() here?
}
// here we know that charAt(index) is not a ')' or '}',
// so why are we calling pop() and isMatchingPair()?
else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
    return false;
}
// isEmpty() returns a boolean, so why not return it directly?
if(st.isEmpty()) {
    return true;
}
else {
    return false;
}

パフォーマンスを向上させるため、コードの明瞭さ、だけ呼び出すexpression.charAt(index)一度。

char ch = expression.charAt(index);
if (ch == '(' || ch == '{' || ch == '[') {
    st.push(ch);
} else if (ch == ')' || ch == '}' || ch == ']'){
    if (st.isEmpty()) {
        return false;
    }
    if (! isMatchingPair(st.pop(), ch)) {
        return false;
    }
}
return st.isEmpty();

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=400580&siteId=1