java 表达式计算_基于Java语言的表达式计算

本文介绍了如何使用Java实现一个表达式计算器,通过双栈策略将中缀表达式转换为后缀表达式,再进行计算。详细展示了拆分数字与运算符、转后缀表达式、计算后缀表达式的步骤,并提供了关键代码实现。
摘要由CSDN通过智能技术生成

一个表达式包含+、—、*、/、()运算符,要计算表达式的值。此处运用栈,分别存储操作数和操作符,大体思路是利用双栈把中缀表达式转换成后缀表达式进行计算。

1.拆分数字与运算符

遇到运算符截断、存储、清空。

2.转后缀表达式

栈A存放后缀表达式,栈B存放运算符

记 B栈顶运算符为a1,当前运算符为a2(若a2为数字直接 a2->A )

1)若 a1>a2,a1->A,a2->B

1)若 a1B;

2)若 a1>=a2

1.若a1>a2,a1->A;(只要该条件满足则一直执行,使得优先级高的运算符放在A中)

2.将高级运算符都排除后,要判断a1=a2 ?( 即是否为()相遇)

如果为左右括号的话就把做括号弹出,否则把a2->B。可以一直排除比它高级的运算法,但是只能抵消一个左括号

PS: a1>a2 表示 在此式中先算a1再算a2,a1与a2的关系在初始化中建立。

3.计算后缀表达式

从左往右扫描,遇到运算符则处理前两位数字

首先,将给定的字符串转为中缀表达式;使用List保存表达式:程序代码如下

/**

* 将字符串转化为List

*

* @param str

* @return

*/

public ArrayList getStringList(String str) {

ArrayList result = new Array

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java表达式计算可以使用Java自带的表达式计算库,也可以手动实现表达式计算。 使用Java自带的表达式计算库可以通过以下步骤实现: 1. 引入Java自带的表达式计算库:`import javax.script.ScriptEngineManager;` 2. 创建ScriptEngine对象:`ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript");` 3. 调用eval方法计算表达式:`Object result = engine.eval(expression);` 其,expression为需要计算表达式,result为计算结果。 例如,计算表达式"1+2*3"的值,可以通过以下代码实现: ``` import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class ExpressionCalculator { public static void main(String[] args) throws ScriptException { String expression = "1+2*3"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); Object result = engine.eval(expression); System.out.println(result); } } ``` 输出结果为7。 手动实现表达式计算可以使用栈来实现。具体步骤如下: 1. 将表达式转换为后缀表达式(逆波兰表达式)。 2. 遍历后缀表达式,如果是数字,则入栈;如果是运算符,则从栈弹出两个数进行运算,并将结果入栈。 3. 遍历完后缀表达式,栈剩下的数就是表达式计算结果。 例如,计算表达式"1+2*3"的值,可以通过以下代码实现: ``` import java.util.Stack; public class ExpressionCalculator { public static void main(String[] args) { String expression = "1+2*3"; String[] postfix = toPostfix(expression); int result = calculate(postfix); System.out.println(result); } private static String[] toPostfix(String expression) { Stack<Character> stack = new Stack<>(); StringBuilder postfix = new StringBuilder(); for (int i = 0; i < expression.length(); i++) { char ch = expression.charAt(i); if (Character.isDigit(ch)) { postfix.append(ch); } else { while (!stack.isEmpty() && priority(stack.peek()) >= priority(ch)) { postfix.append(stack.pop()); } stack.push(ch); } } while (!stack.isEmpty()) { postfix.append(stack.pop()); } return postfix.toString().split(""); } private static int calculate(String[] postfix) { Stack<Integer> stack = new Stack<>(); for (String token : postfix) { if (Character.isDigit(token.charAt(0))) { stack.push(Integer.parseInt(token)); } else { int b = stack.pop(); int a = stack.pop(); int result = 0; switch (token) { case "+": result = a + b; break; case "-": result = a - b; break; case "*": result = a * b; break; case "/": result = a / b; break; } stack.push(result); } } return stack.pop(); } private static int priority(char ch) { switch (ch) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } } ``` 输出结果为7。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值