【问题标题】:Getting wrong output for infix/postfix in java using stacks [duplicate]使用堆栈在java中获取中缀/后缀的错误输出[重复]
【发布时间】:2016-07-08 18:25:57
【问题描述】:

对于输入 (1+3)*(1+3),我得到 1 3 + * 1 3 + 作为输出,而它应该是 1 3 + 1 3 + *。我已经调试过,无法弄清楚为什么乘法直到最后才成立。我在 checkOp() 中没有正确比较它吗?

public String infixToPostfix() throws StackEmptyException{

    Stack<String> s = new Stack<String>();
    String expression = jtfInfix.getText();
    String delims = "+-*/()123456789 ";
    StringTokenizer strToken = new StringTokenizer(expression, delims, true);
    String result = "";

    while(strToken.hasMoreTokens()){

        String token = strToken.nextToken();

        if(token.equals("(")){
            s.push(token);
        }   
        else if(token.equals(")")){

            while(s.peek().equals("(") != true){
                result += " " + s.pop();
            }
        }//first elseif
        else if (checkOp(token)){
            if(s.isEmpty() == true) {
                s.push(token);
            }
            else {
                if(getOrder(token) < findOrder(s.peek())) {
                    result += " " + s.pop();
                    s.push(token);
                }
                else {
                    s.push(token);
                }
            }
        }
        else {
            result += " " + token;
        }
    }
    while(s.isEmpty()) {
        result += s.pop();
    }

    return result;
}// infixToPostFix()

public int findOrder(String token) {
    int order = 0;
    if((token.equals("+")) || (token.equals("-"))) {
        order = 1;
    }
    else if((token.equals("*")) || (token.equals("%"))) {
        order = 2;
    }
    else if(token.equals(")")) {
        order = 0;
    }
    return order;
}

public int getOrder(String token) {
    int order = 0;
    if((token.equals("+")) || (token.equals("-")) ) {
        order = 1;
    }
    else if((token.equals("*"))  || (token.equals("%")) ) {
        order = 2;
    }
    return order;
}


private boolean checkOp(String token) {
    return ((token.equals("+"))  ||  (token.equals("-"))  || (token.equals("*"))  || 
            (token.equals("%"))  );            

}

【问题讨论】:

    标签: java stack stringtokenizer postfix-notation infix-notation


    【解决方案1】:

    有几个错误

    首先你需要在匹配后弹出括号

    while(s.peek().equals("(") != true){
        result += " " + s.pop();
    }
    s.pop(); // pop the matching left parenthesis
    

    你想在完成后从堆栈中弹出所有内容

    while(s.isEmpty()) {
        result += s.pop();
    }
    

    应该是

    while(!s.isEmpty()) {
        result += " " + s.pop();
    }
    

    作为评论记录有助于了解正在发生的事情。

    【讨论】:

    • 感谢您的建议,但输出保持不变。
    • @H22 BevynQ 的回答是正确的。显示的代码导致“1 3 + 1 3 +”和非空堆栈 [(, *, (]。您声称它输出“1 3 + * 1 3 +”的说法似乎不正确。你是否可能改变您发布问题后的代码?
    • @H22 我无法复制您的输出。我的输出匹配@Tibrogargan。我将jtfInfix.getText() 替换为"(1+3)*(1+3)" 进行测试
    • 我敢肯定,由于某种原因,当我调试它时,它不会将“*”或“%”识别为运算符。
    • % 不在您的 delims 变量中。我建议您添加日志消息以查看发生了什么。
    猜你喜欢
    • 2013-09-23
    • 2015-05-09
    • 2012-04-05
    • 2011-05-13
    • 2015-04-19
    • 2015-05-03
    • 2013-02-26
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多