21xrx.com
2024-12-23 06:02:32 Monday
登录
文章检索 我的文章 写文章
我最近在学习如何编写Java代码来计算字符串表达式
2023-06-10 18:48:52 深夜i     --     --

我最近在学习如何编写Java代码来计算字符串表达式。这是一个非常有用的技能,因为它允许我们在不使用计算器或其他计算工具的情况下,直接计算复杂的数学表达式。

在我学习的过程中,我发现了三个关键词,它们是表达式求解、逆波兰记法和栈数据结构。让我们逐一来看看这些关键词究竟意味着什么。

表达式求解指的是将数学表达式转换为可计算的形式,并最终得出表达式的值。在Java中,我们可以使用String类来存储表达式。然后,我们需要编写代码来解析字符串并将其转换为可计算的形式。例如,我们可以使用正则表达式来匹配数字和运算符,并创建一个由数字和运算符组成的列表以便我们之后使用。

逆波兰记法是一种将中缀算术表达式转换为后缀表达式的算法,其中操作符跟随着操作数放在后面。例如,中缀表达式2+3会被转换为后缀表达式2 3 +。在一个后缀表达式中,我们可以通过从左到右处理操作数和操作符来得出表达式的值。在Java中,我们可以使用栈数据结构来实现逆波兰记法。

栈是一种后进先出(LIFO)的数据结构。在Java中,我们可以使用Stack类来实现栈数据结构。在将中缀表达式转换为后缀表达式时,我们可以使用栈来存储操作符。当我们遇到一个操作符时,我们可以将其与栈顶的操作符进行比较,如果栈顶的操作符具有更高的优先级,则将其弹出并向输出列表添加。如果栈顶的操作符具有相同或较低的优先级,则将新的操作符推入栈中。

下面是示例代码,它演示了如何将中缀表达式转换为后缀表达式。请注意,此代码依赖于一个名为OperatorPrecedence的自定义类,该类用于计算及比较不同操作符的优先级。


import java.util.*;

public class InfixToPostfix {

  public static String convert(String input) {

   Stack operators = new Stack<>();

   StringBuilder output = new StringBuilder();

   for (char c : input.toCharArray()) {

     if (OperatorPrecedence.isOperator(c)) {

      while (!operators.isEmpty() && operators.peek() != '(' &&

          OperatorPrecedence.precedence(operators.peek()) >= OperatorPrecedence.precedence(c)) {

        output.append(operators.pop());

      }

      operators.push(c);

     } else if (c == '(') {

      operators.push(c);

     } else if (c == ')') {

      while (!operators.isEmpty() && operators.peek() != '(') {

        output.append(operators.pop());

      }

      operators.pop();

     } else if (Character.isDigit(c)) {

      output.append(c);

     }

   }

   while (!operators.isEmpty()) {

     output.append(operators.pop());

   }

   return output.toString();

  }

}

最后,让我们将所有这些内容结合起来,并编写一个示例程序来演示如何计算给定的字符串表达式。以下是示例代码,它演示了如何使用InfixToPostfix和Stack类来计算表达式的值。


import java.util.*;

public class ExpressionCalculator {

  public static double evaluate(String input) {

   Stack operands = new Stack<>();

   for (char c : InfixToPostfix.convert(input).toCharArray()) {

     if (OperatorPrecedence.isOperator(c)) {

      double operand2 = operands.pop();

      double operand1 = operands.pop();

      operands.push(operation(operand1, operand2, c));

     } else if (Character.isDigit(c)) {

      operands.push((double) (c - '0'));

     }

   }

   return operands.pop();

  }

  private static double operation(double operand1, double operand2, char operator) {

   switch (operator) {

     case '+':

      return operand1 + operand2;

     case '-':

      return operand1 - operand2;

     case '*':

      return operand1 * operand2;

     case '/':

      return operand1 / operand2;

     default:

      throw new IllegalArgumentException("Unknown operator: " + operator);

   }

  }

}

通过使用这个程序,我们可以轻松计算任意给定的数学表达式。

因此,我相信编写Java代码来计算字符串表达式是一个非常有用的技能,它可以帮助我们进行复杂的数学运算,而无需使用计算器或其他计算工具。我希望这篇文章能够帮助您理解如何编写这样的代码,并且能够为您提供有用的建议和示例。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复