【发布时间】:2015-02-15 19:07:56
【问题描述】:
正如标题中所说,我正在尝试创建一个将后缀符号转换为表达式树的代码。在这里你可以检查构造函数:
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-最后我将根压入堆栈然后返回它。
当我尝试运行时没有发生错误,但它也没有以正确的方式工作。代码我检查了很多次,但我无法解决。如果有人看到错误并帮助我,那就太好了。
【问题讨论】:
-
请在格式化您的代码方面付出更多努力 - 缩进现在到处都是,使其难以阅读。
-
“它没有以正确的方式工作”:输入是什么,它应该做什么,以及它做了什么?
-
请解释
if(i == postfixExpr.length()-2)的原因。 -
我使用了 if(i == postfixExpr.length()-2) 因为我想知道 charAt(i) 是否在堆栈的顶部。如果它在顶部,我已经定义了根,所以我可以将左右分配给根。
-
为什么?后缀是一种线性符号。你不需要一棵树。您可以从左到右评估它,或者直接从中生成目标代码,...
标签: java stack expression-trees postfix-notation