当前位置: 首页 > 知识库问答 >
问题:

将后缀表示法转换为ExpressionTree

穆飞星
2023-03-14

正如标题中所说,我正在尝试创建一个代码,将后缀符号转换为表达式树。您可以在此处检查构造函数:

  public byte type;         // 0    : operator, 1: operand (a number)
  public char operator;     // One of '+', '-', '*', '/'
  public int operand;       // A number
ExpressionTreeNode(byte type){this.type = type; left=right=null;}

这是我的代码:

    public static ExpressionTreeNode Postfix2ExpressionTree(String postfixExpr){

            Stack s = new Stack<Object>();
            ExpressionTreeNode root = new ExpressionTreeNode((byte) 0);
            root.operator = postfixExpr.charAt(postfixExpr.length()-1);
            String number = "";

            for(int i = 0;i<postfixExpr.length()-1;i++){

                if(Character.isDigit(postfixExpr.charAt(i)) == true){

                     number = number + postfixExpr.charAt(i);
                     if(Character.isDigit(postfixExpr.charAt(i+1)) == false){
                         ExpressionTreeNode node = new ExpressionTreeNode((byte) 1);
                         node.operand = Integer.valueOf(number);
                         node.right = null;
                         node.left = null;

                         s.push(node);
                         number = "";
                            }    
                         }
                if(i == postfixExpr.length()-2){

                    root.right = (ExpressionTreeNode) s.pop();
                    root.left =(ExpressionTreeNode) s.pop();
                    s.push(root);
                    break;
                }
                else {
                    if(postfixExpr.charAt(i) == '+' || postfixExpr.charAt(i) == '*' || postfixExpr.charAt(i) == '-' || postfixExpr.charAt(i) == '/' ){


                    ExpressionTreeNode node = new ExpressionTreeNode((byte)0);
                    node.operand = postfixExpr.charAt(i);
                    node.right = (ExpressionTreeNode) s.pop();
                    node.left = (ExpressionTreeNode) s.pop();

                    s.push(node);

                    }

                }

            }

        return (ExpressionTreeNode) s.pop();
      }

我用charAt()方法逐个检查每个字符。只需1-将每个操作数推入堆栈2-当遇到运算符时,从堆栈中弹出两个操作数,并将其分配给运算符的左右两侧,然后将新节点推入堆栈。3-最后我将根推到堆栈中,然后返回它。

当我尝试运行时,不会发生错误,但它也没有以正确的方式工作。我检查了很多次代码,但我无法解决它。如果有人看到错误并帮助我,那就太好了。

共有1个答案

薛弘济
2023-03-14

后缀表达式是从左到右解析的——在到达那里之前,不要查看postfix Expr.length()-1。

不要以任何特殊方式创建和处理根节点。它将在解析后位于堆栈的顶部。

这里有一个错误:

node.operand = postfixExpr.charAt(i);

这必须存储在节点中。操作人员

以下是我将如何实施它:

public interface Entry {
  int evaluate();
}
public class Value implements Entry {
  private int value;
  public Value( int value ){
    this.value = value;
  }
  public int  evaluate(){
    return value;
  }
}
public class Operation implements Entry {
  private char operator;
  private Entry left;
  private Entry right;
  public Operation( char operator, Entry left, Entry right ){
    this.operator = operator;
    this.left = left;
    this.right = right;
  }
  public int  evaluate(){
    int l = left.evaluate();
    int r = right.evaluate();
    switch(operator){
    case '+':
      return l + r;
    case '-':
      return l - r;
    case '*':
      return l * r;
    case '/':
      return l / r;
    }
    throw new IllegalStateException( "operator " + operator );
  }
}
public class Parser {
  private Stack<Entry> stack = new Stack<>();
  Pattern pat = Pattern.compile( "[-+*/]" );
  Scanner scanner;
  public void parse( String ex ){
    scanner = new Scanner( ex );
    while( scanner.hasNext() ){
      while( scanner.hasNextInt() ){
        stack.push( new Value( scanner.nextInt() ) );
      }
      while( scanner.hasNext( pat ) ){
        char op = scanner.next( pat ).charAt( 0 );
        Entry right = stack.pop();
        Entry left = stack.pop();
        stack.push( new Operation( op, left, right ) );
      }
    }
  }
  public Entry get(){
    return stack.pop();
  }
}

绝对没有错误处理,所以考虑添加它。

 类似资料:
  • 我试图将给定的数字或代数表达式从内缀符号转换为后缀符号。我希望能够对多位数和负数的数字也这样做。我没有使用指数,如2^3=8。 我使用了一个有点困难的输入表达式,并且我能够成功地将其解析为负数和由多个数字组成的数字。然后,我将这个最终表达式放入ListBuffer中。我创建了一个堆栈类,并定义了我需要的几个方法。我唯一的问题(可能不是唯一的问题)是当我遇到“我不相信我正确地使用了pop和peek”

  • 本文向大家介绍将中缀转换为后缀表达式,包括了将中缀转换为后缀表达式的使用技巧和注意事项,需要的朋友参考一下 前缀表达式是人类可读和可解的。我们可以轻松地区分算子的顺序,也可以在计算数学表达式时先使用括号将其求解。计算机无法轻松地区分运算符和括号,这就是为什么需要后缀转换的原因。 要将中缀表达式转换为后缀表达式,我们将使用堆栈数据结构。通过从左到右扫描infix表达式,当我们得到任何操作数时,只需将

  • 我应该将以下内容转换为后缀形式: 我得到了这个答案: 这是正确的吗?如果我使用了错误的后缀形式,那么之后还有很多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。

  • 我没有得到正确的输出为这个程序得到abcde-*给输入在主 这个程序是将表达式从中缀转换为后缀这里是算法 算法1。从左到右扫描中缀表达式。 如果扫描的字符是操作数,则将其输出。 否则, ......3.1如果扫描的运算符的优先级大于堆栈中运算符的优先级(或者堆栈是空的),则推送它。...... 3.2否则,从堆栈中弹出操作符,直到被扫描操作符的优先级小于-等于位于堆栈顶部的操作符的优先级。将扫描的

  • 本文向大家介绍将中缀转换为前缀表达式,包括了将中缀转换为前缀表达式的使用技巧和注意事项,需要的朋友参考一下 要通过计算机求解表达式,我们可以将其转换为后缀形式或前缀形式。在这里,我们将看到中缀表达式如何转换为前缀形式。 首先,中缀表达式反转。注意,对于反转,圆括号也将反转。 例如:表达式:A + B *(C-D) 反转后的表达式为:)D – C(* B + A 因此我们需要将左括号转换为右括号,反

  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi