これを行う方法がわかりませんか?たとえば、ac+ ac+*
バイナリツリー形式に変換する方法を誰かが説明できますか?? この式を、このツリーの括弧で囲まれた完全な文字列表現に変換する必要があります。
質問する
7575 次
2 に答える
-3
Node
ツリーのノードを表すクラスを使用します。私のノードに必要なものは次のとおりです。
public interface Node<T> {
public void addChild(Node<T>);
}
TreeNode<T>
constructor を持つ実装クラスがあると仮定しpublic TreeNode(T value)
ます。
Token
式を表す s の配列が得られるように、既に文字列を切り刻み、すべての文字を他の方法で解析したと仮定します。
public interface Token {
/**
* @return The number of operands this token takes.
* A return value of 0 indicates this token does not
* take any operands.
*/
public int getOperandCount();
}
(ツリーから値を読み取ることができるように、クラスに追加のメソッドを含めることが望ましい場合がありますが、それを構築するために厳密に必要というわけではありません。)
また、
public class MalformedExpressionException extends IllegalArgumentException{
public MalformedExpressionException(String reason){/* [ ... ] */};
// [ ... ]
}
邪魔にならないように、次の関数はツリーを生成し、そのルート ノードを返します。
public static Node<Token> makeTree(Token [] tokens){
Stack<Node<Token>> stack = new Stack<>();
try{
for(Token t:tokens){
Node<Token> node = new TreeNode<Token>(t);
for(int idx = 0; idx < t.getOperandCount(); idx++)
node.addChild(stack.pop());
stack.push(node);
}
}catch (EmptyStackException e){
throw new MalformedExpressionException("too few operands");
}
if(stack.size() != 1)
throw new MalformedExpressionException("too many operands");
return stack.pop();
}
于 2013-11-10T21:52:14.063 に答える