-1

我正在尝试将表达式更改为前缀表示法。我能够弄清楚后缀表示法,我想知道在创建我的前缀类时是否可以利用我的后缀类的基本模板。我想要一个类似... (6 * ( 24 + 81)) 的表达式并输出:* 6 + 24 81。这是否可能不跟踪级别?...意思是我需要一个当我的循环进入表达式的括号部分时跟踪变量?我只是很难想象结构是如何工作的。

这是我的后缀代码:

    static Stack operatorStack = new Stack();
String ConvertToPostfix(String exp) {
    exp = "("+exp+")";
    int i;
    char token;
    String output = "";

    for (i = 0; i < exp.length(); i++) {
        token = exp.charAt(i);
        if (Character.isLetterOrDigit(token) == true)
            output += token;
        else if (token == '(')
            operatorStack.push(token);
        else if (token == ')') {
            char topChar;
            while ((topChar = peekAtTop()) != '(') {
                output += topChar;
                popAtTop();
            }

        operatorStack.pop();
        } 
        else {
            while (priority(token) <= priority(peekAtTop())) {
                output += peekAtTop();
                popAtTop();
            }
            operatorStack.push(token);
        }
}
    return output;

}
4

1 回答 1

2

本质上,表达式是树结构

这是一个随机的例子: 3 * ((7 + 1) / 4 + (17 - 5)

要更改线性表示(即作为字符串的表达式),您只需更改遍历树的方式。上面链接的维基百科文章包含所有三个示例。

你需要做的是:

  • 学习如何用 Java 表示树(总是很方便);
  • 将您的表达式解析成一棵树(相当简单),StringTokenizer是您的朋友;
  • 将三个遍历过程翻译成Java;
  • 调用您的教授要求的任何程序。(顺便说一句,多听教授的话不会有什么坏处。)

希望这可以帮助!

于 2013-04-19T02:15:23.707 回答