关于布尔值的反波兰表示法

时间:2016-09-13 13:49:32

标签: java polish

Heloo。我正在尝试实现一个java代码,它会根据我的输入返回true或false。 例如,如果我有 true AND NOT(false AND true)AND NOT TRUE它应该返回FALSE

我试图解析我的imput String并首先将元素重新排序到抛光表示法中,然后评估抛光形式。如果我没有任何东西,那就完美了

但如果我有 true AND NOT((false或false)AND(true或false))AND NOT TRUE 它返回TRUE但它应该返回false。

运行getPolishForm()函数后,我的RPF看起来像这样

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

我看到问题出现在第二个NOT上,因为它否定了所有这一部分((假或假)AND(真或假))并且不是真的 但它应该只是否定了paranthesys中的内容。

这是以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

0 个答案:

没有答案