我最近一直在研究java中的树。我在sanfoundry上找到了这个代码。com,这对于表达式树来说是非常棒的。它使用前缀,然后打印出前缀表达式的中缀和后缀,最后打印出答案。我的问题是,我正试图找出如何将它简化为只接受后缀并打印出答案。因此,它不必读入前缀并进行所有这些操作,而是读入后缀并打印出答案。下面是我找到的代码。这是一个简单的修复,只是让它做后缀?还是更难的?
class ExpressionTree
{
/** class TreeNode **/
class TreeNode
{
char data;
TreeNode left, right;
/** constructor **/
public TreeNode(char data)
{
this.data = data;
this.left = null;
this.right = null;
}
}
/** class StackNode **/
class StackNode
{
TreeNode treeNode;
StackNode next;
/** constructor **/
public StackNode(TreeNode treeNode)
{
this.treeNode = treeNode;
next = null;
}
}
private static StackNode top;
/** constructor **/
public ExpressionTree()
{
top = null;
}
/** function to clear tree **/
public void clear()
{
top = null;
}
/** function to push a node **/
private void push(TreeNode ptr)
{
if (top == null)
top = new StackNode(ptr);
else
{
StackNode nptr = new StackNode(ptr);
nptr.next = top;
top = nptr;
}
}
/** function to pop a node **/
private TreeNode pop()
{
if (top == null)
throw new RuntimeException("Underflow");
else
{
TreeNode ptr = top.treeNode;
top = top.next;
return ptr;
}
}
/** function to get top node **/
private TreeNode peek()
{
return top.treeNode;
}
/** function to insert character **/
private void insert(char val)
{
try
{
if (isDigit(val))
{
TreeNode nptr = new TreeNode(val);
push(nptr);
}
else if (isOperator(val))
{
TreeNode nptr = new TreeNode(val);
nptr.left = pop();
nptr.right = pop();
push(nptr);
}
}
catch (Exception e)
{
System.out.println("Invalid Expression");
}
}
/** function to check if digit **/
private boolean isDigit(char ch)
{
return ch >= '0' && ch <= '9';
}
/** function to check if operator **/
private boolean isOperator(char ch)
{
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
/** function to convert character to digit **/
private int toDigit(char ch)
{
return ch - '0';
}
/** function to build tree from input */
public void buildTree(String eqn)
{
for (int i = eqn.length() - 1; i >= 0; i--)
insert(eqn.charAt(i));
}
/** function to evaluate tree */
public double evaluate()
{
return evaluate(peek());
}
/** function to evaluate tree */
public double evaluate(TreeNode ptr)
{
if (ptr.left == null && ptr.right == null)
return toDigit(ptr.data);
else
{
double result = 0.0;
double left = evaluate(ptr.left);
double right = evaluate(ptr.right);
char operator = ptr.data;
switch (operator)
{
case '+' : result = left + right; break;
case '-' : result = left - right; break;
case '*' : result = left * right; break;
case '/' : result = left / right; break;
default : result = left + right; break;
}
return result;
}
}
/** function to get postfix expression */
public void postfix()
{
postOrder(peek());
}
/** post order traversal */
private void postOrder(TreeNode ptr)
{
if (ptr != null)
{
postOrder(ptr.left);
postOrder(ptr.right);
System.out.print(ptr.data);
}
}
/** function to get infix expression */
public void infix()
{
inOrder(peek());
}
/** in order traversal */
private void inOrder(TreeNode ptr)
{
if (ptr != null)
{
inOrder(ptr.left);
System.out.print(ptr.data);
inOrder(ptr.right);
}
}
/** function to get prefix expression */
public void prefix()
{
preOrder(peek());
}
/** pre order traversal */
private void preOrder(TreeNode ptr)
{
if (ptr != null)
{
System.out.print(ptr.data);
preOrder(ptr.left);
preOrder(ptr.right);
}
}
}
这是主要的方法。
/** class ExpressionTreeTest **/
public class ExpressionTreeTest
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Expression Tree Test");
/** make object of ExpressionTree **/
ExpressionTree et = new ExpressionTree();
System.out.println("\nEnter equation in prefix form");
et.buildTree(scan.next());
System.out.print("\nPrefix : ");
et.prefix();
System.out.print("\n\nInfix : ");
et.infix();
System.out.print("\n\nPostfix : ");
et.postfix();
System.out.println("\n\nEvaluated Result : "+ et.evaluate());
}
}
后缀是一种线性表示法。您根本不需要一棵树来计算它,只需要一个堆栈。你从错误的地方出发了。
本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。
这是一个理论上的问题: 我必须计算一个表达式,我已经从中缀转换到后缀。后缀保存在中,因为我希望避免使用。这样我就知道数字之间的除法在哪里,我可以按“正确”的顺序访问它。 它看起来是这样的: 现在我想用两个堆栈: null 如果我到达一个运算符,并且数量计数至少为2,我将执行该操作并将其推到目标堆栈上。到达原始堆栈的末尾(现在是空的),我会把所有的东西都传递给它,然后从头开始,直到只剩下结果。 我现
我没有得到正确的输出为这个程序得到abcde-*给输入在主 这个程序是将表达式从中缀转换为后缀这里是算法 算法1。从左到右扫描中缀表达式。 如果扫描的字符是操作数,则将其输出。 否则, ......3.1如果扫描的运算符的优先级大于堆栈中运算符的优先级(或者堆栈是空的),则推送它。...... 3.2否则,从堆栈中弹出操作符,直到被扫描操作符的优先级小于-等于位于堆栈顶部的操作符的优先级。将扫描的
当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊
本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使
我正在尝试将后缀表达式转换为二叉树。My函数将标记(字符串)列表作为参数。 每次我给函数任何输入时,调试器都会写一条消息:函数“add”中的非穷举模式。 我的想法是:一个接一个地读取标记,然后确定它是运算符还是操作数。如果是操作数,则不要将任何节点保存到树中,并将数字存储到堆栈中。否则,我用操作符创建一个节点,从堆栈中弹出符号,将它们设置为新节点的子节点,并将操作符推送到堆栈中。 如果字符串列表为