21xrx.com
2025-06-17 01:23:11 Tuesday
登录
文章检索 我的文章 写文章
Java利用算法计算字符串算式的值
2023-06-15 07:40:41 深夜i     7     0
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实现字符串算式的计算是很方便的。借助逆波兰表达式和栈等数据结构,我们可以使代码更加简洁和优雅。

  
  

评论区