21xrx.com
2024-11-22 10:11:12 Friday
登录
文章检索 我的文章 写文章
Java利用算法计算字符串算式的值
2023-06-15 07:40:41 深夜i     --     --
Java 算法 字符串算式 逆波兰表达式

在Java编程中,经常需要计算数学算式的值。而当这些算式以字符串的形式给出时,就需要利用算法将其转化为可计算的形式。本文将介绍如何用Java计算字符串算式的值。

一、算式转化

首先,需要将字符串算式转化为可计算的形式。一种常见的方法是使用逆波兰表达式,即将算式中的符号和数字转化为后缀表达式,然后再进行计算。

二、逆波兰表达式

逆波兰表达式指的是将运算符放在后面的表达式形式。例如,将“2+3”转化为逆波兰表达式就是“2 3 +”。java中可以使用栈来实现逆波兰表达式的转化。

三、代码实现

下面是Java代码的实现:


import java.util.Stack;

public class ReversePolishNotation {

  public static void main(String[] args) {

    String expression = "2*(3+5)-6/2";// 输入待计算的算式

    String suffixExpression = reversePolishNotation(expression);// 转化为后缀表达式

    System.out.println("后缀表达式为:" + suffixExpression);

    int result = calculate(suffixExpression);// 计算后缀表达式的值

    System.out.println("计算结果为:" + result);

  }

  public static String reversePolishNotation(String expression) {

    Stack stack = new Stack<>();

    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < expression.length(); i++) {

      char c = expression.charAt(i);

      if (Character.isDigit(c)) {

        sb.append(c);

      } else {

        sb.append(" ");

        if (c == '(') {

          stack.push(c);

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

          char tmp = stack.pop();

          while (tmp != '(') {

            sb.append(tmp).append(" ");

            tmp = stack.pop();

          }

        } else {

          while (!stack.isEmpty() && getPriority(c) <= getPriority(stack.peek())) {

            sb.append(stack.pop()).append(" ");

          }

          stack.push(c);

        }

      }

    }

    while (!stack.isEmpty()) {

      sb.append(stack.pop()).append(" ");

    }

    return sb.toString();

  }

  public static int calculate(String suffixExpression) {

    Stack stack = new Stack<>();

    String[] suffix = suffixExpression.split(" ");

    for (String s : suffix) {

      if (!s.isEmpty()) {

        if (Character.isDigit(s.charAt(0))) {

          stack.push(Integer.parseInt(s));

        } else {

          int b = stack.pop();

          int a = stack.pop();

          int res = 0;

          switch (s) {

            case "+":

              res = a + b;

              break;

            case "-":

              res = a - b;

              break;

            case "*":

              res = a * b;

              break;

            case "/":

              res = a / b;

              break;

          }

          stack.push(res);

        }

      }

    }

    return stack.pop();

  }

  public static int getPriority(char c) {

    switch (c) {

      case '+':

      case '-':

        return 1;

      case '*':

      case '/':

        return 2;

      default:

        return 0;

    }

  }

}

四、总结

通过本文的介绍,我们可以看到利用Java实现字符串算式的计算是很方便的。借助逆波兰表达式和栈等数据结构,我们可以使代码更加简洁和优雅。

  
  

评论区

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