4

へろー。入力に応じて true または false を返す Java コードを実装しようとしています。たとえば、true AND NOT( false AND true) AND NOT TRUE がある場合、FALSE を返す必要があります。

入力文字列を解析し、最初に要素を洗練された表記法に並べ替えてから、洗練された形式を評価しようとしました。私がもう持っていない場合、それは完全に機能します

しかし、true AND NOT( (false または false) AND (true OR false)) AND NOT TRUE の場合、TRUE を返しますが、false を返す必要があります。

getPolishForm() 関数を実行すると、RPF は次のようになります

true false false OR true false OR AND true NOT AND NOT AND

この部分 ( (false または false) AND (true OR false)) AND NOT TRUE をすべて否定するため、問題は 2 番目の NOT にあることがわかりますが、括弧内のコンテンツだけを否定する必要があります。

これは、polsih 形式で文字列のリストを返す関数です。

  ArrayList<String> getPolishForm() {
    ArrayList<String> postFix = new ArrayList<String>();
    if (infixForm == null)
        return null;
    Stack<String> stack = new Stack<String>();
    for (int i = 0; i < infixForm.size(); i++) {
        switch (new Priority(infixForm.get(i)).getValue()) {
        case 3:
            while (!stack.empty() && (stack.peek().equals("AND"))) {
                postFix.add(stack.pop());
            }
            stack.push(infixForm.get(i));
            break;
        case 4:
            stack.push(infixForm.get(i));
            break;
        case 1:
            stack.push(infixForm.get(i));
            break;
        case 2:
            while (!stack.empty() && !stack.peek().equals("LPARAN")) {
                postFix.add(stack.pop());
            }
            stack.pop();
            break;
        case 5:
            stack.push(infixForm.get(i));
            break;

        default:
            postFix.add(infixForm.get(i));
            break;
        }
    }
    while (!stack.empty()) {
        postFix.add(stack.pop());
    }

    return postFix;
}

そして、これはRPFを評価する関数です

Boolean getResult() {
    Stack<Boolean> stack = new Stack<Boolean>();
    boolean result = false;

    for (int i = 0; i < postFix.size(); i++) {
        if (isExpression(postFix.get(i))) {
            stack.push(new ReMatcher(postFix.get(i), tags).isMatch());//this line processes the string from the infixForm and returns a boolean

        } else {
            boolean op1 = stack.pop();
            try {
                boolean op2 = stack.pop();

                String operator = postFix.get(i);
                if (operator.equals("NOT")) {
                    op1 = !op1;
                    i++;
                    operator = postFix.get(i);
                }

                if (operator.equals("OR") )
                    result = op1 || op2;

                } else if (operator.endsWith("AND") )
                    result = op1 && op2;

            } catch (EmptyStackException e) {
                result = !op1;
            }
            stack.push(result);
        }
    }
    return stack.pop();

よろしくお願いします:D

4

0 に答える 0