Java代码实现后缀表达式求值
作者:互联网
后缀表达式求值
1)后缀表达式又称逆波兰表达式,与前缀表达式相似,只是位于操作数之后
2)举例说明:(3+4)*5-6对应的后缀表达式为3 4 + 5 * 6 -
后缀表达式的计算机求值
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素和栈项元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
例如: (3+4)X 5-6对应的后缀表达式就是34+5 X 6-,针对后缀表达式求值步骤如下:
1)从左至右扫描, 将3和4压入堆栈;
2)遇到+运算符, 因此弹出4和3 (4为栈项元素,3为次项元素),计算出3+4的值,得7,再将7入栈;
3)将5入栈;
4)接下来是X运算符,因此弹出5和7,计算出7 * 5=35, 将35入栈;
5)将6入栈;
6)最后是-运算符,计算出35-6的值, 即29, 由此得出最终结果
代码实现:
package com.cwnu.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/*
* 逆波兰计算器,使用jdk提供的stack栈
* */
public class PolandNotation {
public static void main(String[] args) {
//定义逆波兰表达式
//(3+4)*5-6对应的后缀表达式为3 4 + 5 * 6 -
String suffixExpression = "3 4 + 5 * 6 -";
//先将表达式放入ArrayList中
List<String> list = getListString(suffixExpression);
//再将ArrayList传递一个方法,配合栈完成计算
int res = calculate(list);
System.out.println(res);
}
//将表达式,依次放入ArrayList中
public static List<String> getListString(String expression) {
String[] split = expression.split(" ");
List<String> list = new ArrayList<String>();
for (String item : split) {
list.add(item);
}
return list;
}
public static int calculate(List<String> list) {
//创建一个栈
Stack<String> stack = new Stack<>();
//遍历list
for (String itme : list) {
//使用正则表达式取出
if (itme.matches("\\d+")) {//匹配的是多位数
stack.push(itme);
} else {
//pop出两个数进行运算
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
int res = 0;
if (itme.equals("+")) {
res = num1 + num2;
} else if (itme.equals("-")) {
res = num1 - num2;
} else if (itme.equals("*")) {
res = num1 * num2;
} else if (itme.equals("/")) {
res = num1 / num2;
} else {
throw new RuntimeException("运算夫错误");
}
stack.push(String.valueOf(res));
}
}
//最后留在战中的数据就是运算结果
return Integer.parseInt(stack.pop());
}
}
标签:itme,Java,后缀,res,list,求值,stack,表达式 来源: https://blog.csdn.net/rotry11/article/details/121137158