网站首页 > java教程 正文
表达式求值是程序设计语言编译中的一个最基本问题。它的实现是栈应用的又一个典型例子。表达式求值可以通过将中缀表达式转换为后缀表达式(逆波兰表达式)来实现,并使用栈对后缀表达式进行求值。
- 将中缀表达式转换为后缀表达式(逆波兰表达式)。
- 使用栈来存储操作符,遍历中缀表达式的每个元素。
- 如果是数字,则直接输出。
- 如果是操作符,则判断其与栈顶操作符的优先级,如果栈顶操作符优先级较高,则弹出栈顶操作符并输出,直到栈为空或者栈顶操作符优先级不高于当前操作符。
- 如果是左括号,则入栈。
- 如果是右括号,则弹出栈内所有操作符并输出,直到遇到左括号为止。
- 使用栈对后缀表达式进行求值。
- 遍历后缀表达式的每个元素。
- 如果是数字,则入栈。
- 如果是操作符,则从栈中弹出两个操作数进行计算,并将结果入栈。
下面以表达式4+2*3-10/5为例编写应用程序。
import java.util.Stack;
public class ExpressionEvaluator {
public static void main(String[] args) {
String expression = "4+2*3-10/5";
System.out.println("Result: " + evaluateExpression(expression)); // 输出计算结果
}
public static int evaluateExpression(String expression) {
String postfixExpression = infixToPostfix(expression); // 中缀转后缀
return evaluatePostfix(postfixExpression); // 求值后缀表达式
}
public static String infixToPostfix(String expression) {
StringBuilder postfix = new StringBuilder();
Stack<Character> operatorStack = new Stack<>();
for (char ch : expression.toCharArray()) {
if (Character.isDigit(ch)) {
postfix.append(ch); // 如果是数字,直接输出到后缀表达式
} else if (ch == '+' || ch == '-') {
while (!operatorStack.isEmpty() && (operatorStack.peek() == '+' || operatorStack.peek() == '-' || operatorStack.peek() == '*' || operatorStack.peek() == '/')) {
postfix.append(operatorStack.pop()); // 弹出栈内优先级高于当前操作符的操作符
}
operatorStack.push(ch); // 当前操作符入栈
} else if (ch == '*' || ch == '/') {
while (!operatorStack.isEmpty() && (operatorStack.peek() == '*' || operatorStack.peek() == '/')) {
postfix.append(operatorStack.pop()); // 弹出栈内优先级高于当前操作符的操作符
}
operatorStack.push(ch); // 当前操作符入栈
} else if (ch == '(') {
operatorStack.push(ch); // 左括号入栈
} else if (ch == ')') {
while (!operatorStack.isEmpty() && operatorStack.peek() != '(') {
postfix.append(operatorStack.pop()); // 弹出栈内所有操作符直到遇到左括号
}
operatorStack.pop(); // 弹出左括号
}
}
while (!operatorStack.isEmpty()) {
postfix.append(operatorStack.pop()); // 将栈内剩余操作符输出
}
return postfix.toString();
}
public static int evaluatePostfix(String postfixExpression) {
Stack<Integer> operandStack = new Stack<>();
for (char ch : postfixExpression.toCharArray()) {
if (Character.isDigit(ch)) {
operandStack.push(Character.getNumericValue(ch)); // 如果是数字,入栈
} else {
int operand2 = operandStack.pop();
int operand1 = operandStack.pop();
switch (ch) {
case '+':
operandStack.push(operand1 + operand2);
break;
case '-':
operandStack.push(operand1 - operand2);
break;
case '*':
operandStack.push(operand1 * operand2);
break;
case '/':
operandStack.push(operand1 / operand2);
break;
}
}
}
return operandStack.pop(); // 返回栈顶元素,即表达式的计算结果
}
}
说明:
- infixToPostfix 方法将中缀表达式转换为后缀表达式。
- evaluatePostfix 方法对后缀表达式进行求值。
猜你喜欢
- 2024-11-12 本地方法栈、JVM栈、本地内存和JVM Heap的区别与关系
- 2024-11-12 Java基础之堆、栈、方法区、类加载器——JVM内存模型分析
- 2024-11-12 java之栈内存与堆内存(栈内存 和堆内存)
- 2024-11-12 深入了解Java虚拟机栈以及内存模型
- 2024-11-12 Java虚拟机栈区域(虚拟机栈描述的是java方法执行的内存模型)
- 2024-11-12 一文读懂Java的“栈内存”[Stack]和“堆空间”[Heap]
- 2024-11-12 JVM 内存结构(jvm内存结构及作用)
- 2024-11-12 「JVM系列」 从一到掌握JVM系列之Java虚拟机栈
- 2024-11-12 答读者问:Java 里的堆内存和栈内存是什么意思?
- 2024-11-12 Java中堆和栈的区别(java中堆和栈的区别在哪)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)