首页 > 解决方案 > 编写一个 Java 程序来评估后缀表示法中的表达式 - 数据结构和算法类

问题描述

这是一个数据结构和算法类作业。我不想要答案,我只需要一些帮助,甚至可以从哪里开始。老师背书,有些帮助,但不大。下面有一个基本代码,我要填写一个空格。感谢您给我的任何帮助。

编译器使用堆栈来评估表达式并生成机器语言代码。人类通常会编写像 3 + 4 和 7 / 9 这样的表达式,其中运算符(这里是 + 或 /)写在其操作数之间。这称为中缀表示法。为了计算一个复杂的中缀表达式,编译器首先将表达式转换为后缀表示法,其中运算符写在其两个操作数的右侧。前面的中缀表达式将在后缀表示法中分别显示为 3 4 + 和 7 9 /。您需要编写一个 Java 程序来评估后缀符号的表达式并显示结果。假设一个表达式仅包含括号、一位整数(作为操作数)和以下运算符:“+”、“-”、“*”、“/”、“%”。中缀符号中的表达式在文件 InfixExpressions.txt 中给出。后缀符号中的相应表达式在文件 PostfixExpressions.txt 中给出。您的程序应该从文件 PostfixExpressions.txt 中读取表达式,计算每个 postfix 表达式,并在表格报告中显示结果。部分 Java 程序在文件 PostfixEvaluator.java 中给出。填写 PostfixEvaluator.java 中缺少的代码,使程序完整并正常工作。测试驱动程序在文件 TestDriver.java 中给出。您需要创建一个名为 labs.lab3 的包以包含所有类。程序的示例输出在文件 SampleOutput.txt 中给出。部分 Java 程序在文件 PostfixEvaluator.java 中给出。填写 PostfixEvaluator.java 中缺少的代码,使程序完整并正常工作。测试驱动程序在文件 TestDriver.java 中给出。您需要创建一个名为 labs.lab3 的包以包含所有类。程序的示例输出在文件 SampleOutput.txt 中给出。部分 Java 程序在文件 PostfixEvaluator.java 中给出。填写 PostfixEvaluator.java 中缺少的代码,使程序完整并正常工作。测试驱动程序在文件 TestDriver.java 中给出。您需要创建一个名为 labs.lab3 的包以包含所有类。程序的示例输出在文件 SampleOutput.txt 中给出。

中缀表达式:

1 + 2 - 3 + 4 - 5
1 * 2 * 3 / 2 / 3
1 + 2 * 3 - 4 / 2
1 * 2 + 3 - 4 / 5
1 + 2 * 4 % 3 + 4
( 1 + 2 ) * 3 - 4 / 2
5 * ( 4 + 3 ) - 2 / 1
( ( 1 + 2 ) * 3 - 4 ) / 2
( 5 + 4 % 3 - 2 ) / 2
1 + 2 * 4 / ( 2 + 2 )

后缀表达式:

1 2 + 3 - 4 + 5 -
1 2 * 3 * 2 / 3 /
1 2 3 * + 4 2 / -
1 2 * 3 + 4 5 / -
1 2 4 * 3 % + 4 +
1 2 + 3 * 4 2 / -
5 4 3 + * 2 1 / -
1 2 + 3 * 4 - 2 /
5 4 3 % + 2 - 2 /
1 2 4 * 2 2 + / +

样本输出:

Postfix Expression            Evaluation Result             
1 2 + 3 - 4 + 5 -             -1                            
1 2 * 3 * 2 / 3 /             1                             
1 2 3 * + 4 2 / -             5                             
1 2 * 3 + 4 5 / -             5                             
1 2 4 * 3 % + 4 +             7                             
1 2 + 3 * 4 2 / -             7                             
5 4 3 + * 2 1 / -             33                            
1 2 + 3 * 4 - 2 /             2                             
5 4 3 % + 2 - 2 /             2                             
1 2 4 * 2 2 + / +             3                    

部分代码:

package labs.lab3;

import java.util.Stack;
import java.util.EmptyStackException;

public class PostfixEvaluator
{
    private Stack<Integer> stack;
    private String expression;

    public PostfixEvaluator(String e)
    {
        stack = new Stack<Integer>();
        expression = e;
    }

        // Evaluate the postfix expression and return the evaluation result
    public int Evaluate()
    {
      /* Missing code start here */



          /* Missing code end here */
    }

    // Perform an operation on the two operands
    public int Calculate(int operand1, int operand2, char operation)
    {
        int result = 0;

        switch (operation)
        {
        case '+':
            result = operand1 + operand2;
            break;
        case '-':
            result = operand1 - operand2;
            break;
        case '/':
            result = operand1 / operand2;
            break;
        case '*':
            result = operand1 * operand2;
            break;
        case '%':
            result = operand1 % operand2;
            break;
        }
        return result;
    }
}

标签: javadata-structures

解决方案


评估后缀表达式的算法非常简单。这个想法是您将操作数压入堆栈,直到遇到运算符。然后从堆栈中弹出两个操作数,应用操作数,并将结果推回堆栈。完成后,最终结果在堆栈上。

例如,给定后缀表达式4 5 + 3 *

  1. 读“4”。这是一个操作数,所以将它压入堆栈。堆栈包含[4].
  2. 读“5”。这是一个操作数,所以将它压入堆栈。堆栈包含[5,4].
  3. 读“+”。是运营商。从堆栈中弹出 5 和 4。堆栈包含[].
  4. 将 5 和 4 相加,得到 9。将其压入堆栈。堆栈包含[9].
  5. 读“3”。这是一个操作数,所以将它压入堆栈。堆栈包含[3,9].
  6. 读 '*'。是运营商。从堆栈中弹出 3 和 9。堆栈包含[].
  7. 将 9 和 3 相乘,得到 27。将其压入堆栈。堆栈包含[27].
  8. 您已到达输入的末尾。从堆栈中弹出结果。

如果在任何时候堆栈上都没有足够的操作数,那么就会出现错误。如果在输入结束时,堆栈中有多个值,则存在错误。


推荐阅读