【问题标题】:Infix to Postfix using stacks and Precedence of Operators [duplicate]使用堆栈和运算符的优先级对后缀进行中缀[重复]
【发布时间】:2012-11-05 17:47:04
【问题描述】:

我知道在 SO 上已经有类似的问题,但我找不到解决我遇到的问题的问题。我正在尝试制作一种将中缀表示法表达式转换为后缀表示法的方法,同时实现运算符的优先级以获得正确的输出。 我用常用的方法(push、pop、peek 等)制作了自己的堆栈类,它工作得非常好。我的问题是,对于更复杂的表达式,例如 A-(B+C^D^C)/D*B ,我得到了错误的输出。转换的结果应该是 ABCDC^^+D/B*- 而我不断得到 ABCDC^^+D/-B

这是我的方法:

    public static String infixToPostfix(char[] expressionArray, CharStack opStack){
    String output = "";
    int length = expressionArray.length;
    for(int i = 0; i < length; i++){    
        if(isOperatorOrBracket(expressionArray[i])){ 
            if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                opStack.push(expressionArray[i]);
            }else if(priorityAtInput(expressionArray[i]) == priorityAtStack(opStack.peek())){
                output = output + expressionArray[i];
            }else{
                while(opStack.peek() != '('){
                    output = output + opStack.pop();
                }
                opStack.pop();
            }
        }else{
            output = output + expressionArray[i];
        }
    }
    while(!opStack.empty()){
        if(opStack.peek() != '('){
            output = output + opStack.pop();
        }else if(opStack.peek() == '('){
            opStack.pop();
        }
    }
    return output;
}

如果您需要任何组件方法,请告诉我。非常感谢任何帮助!

【问题讨论】:

  • 如果没有诸如priorityAtStack 之类的方法,我认为我无法理解这段代码,并且错误很可能在其中一种方法中。构建一个包含完整、可运行程序的文件并将其放在某处联机可能是个好主意。

标签: java infix-notation stack postfix-notation


【解决方案1】:

盯着屏幕一个小时后,我发现了问题。感谢 Eclipse 中的调试器!

public static String infixToPostfix(char[] expressionArray, CharStack opStack){
    String output = "";
    int length = expressionArray.length;
    for(int i = 0; i < length; i++){    
        if(isOperatorOrBracket(expressionArray[i])){ 
            if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                opStack.push(expressionArray[i]);
            }else if(priorityAtInput(expressionArray[i]) < priorityAtStack(opStack.peek())){
                while(priorityAtInput(expressionArray[i]) < priorityAtStack(opStack.peek())){
                    output = output + opStack.pop();
                    if(opStack.peek() == '('){
                        opStack.pop();
                        break;
                    }else if(priorityAtInput(expressionArray[i]) >= priorityAtStack(opStack.peek())){
                        opStack.push(expressionArray[i]);
                        break;
                    }
                }
            }else{
                while(opStack.peek() != '('){
                    output = output + opStack.pop();
                }
                opStack.pop();
            }
        }else{
            output = output + expressionArray[i];
        }
    }
    while(!opStack.empty()){
        if(opStack.peek() != '('){
            output = output + opStack.pop();
        }else if(opStack.peek() == '('){
            opStack.pop();
        }
    }
    return output;
}

【讨论】:

  • 问题出在哪里?
猜你喜欢
  • 2019-11-06
  • 2021-10-25
  • 2015-09-16
  • 2018-08-22
  • 2011-08-30
  • 2021-10-20
  • 2013-09-23
  • 2012-04-10
  • 2019-06-10
相关资源
最近更新 更多