1 栈实现后缀表达式计算器
1.1 表达式分类
表达式可分为3类,前缀表达式,中缀表达式,后缀表达式
中缀表达式是日常中常用的,但是对计算机而言,中缀表达式并不方便,一般将中缀表达式转换成后缀表达式计算
1.1.1 前缀表达式
前缀表达式又称为波兰表达式,前缀表达式的运算符位于操作数之前
如:
中缀:(3 + 4) * 5 - 6
前缀: - * + 3 4 5 6
前缀表达式的运算过程:

1.1.2 后缀表达式
后缀表达式又称逆波兰表达式,其运算符位于操作数之前
如:
中缀: (3 + 4) * 5 - 6
后缀: 3 4 + 5 * 6 -

后缀表达式的运算过程:

1.2 后缀表达式运算
将后缀表达式存入列表中,遍历列表,区分是数字还是运算符,如果是数字则入栈,如果是运算符出栈运算,最后栈中剩下的结果就是表达式的值
/**
* @author 雫
* @date 2021/3/22 - 11:41
* @function 逆波兰计算器
*/
@SuppressWarnings("all")
public class PolandNotationTest {
public static void main(String[] args) {
//逆波兰表达式 中缀为 (3 + 4) * 5 - 6
String suffixExpression = "3 4 + 5 * 6 -";
List<String> rpnList = getListString(suffixExpression);
int res = calculate(rpnList);
System.out.println("后缀表达式运算结果: " + res);
}
//将一个逆波兰表达式,依次将数据和运算符放入ArrayList中
public static List<String> getListString(String suffixExpression) {
String[] split = suffixExpression.split(" ");
List<String> list = new ArrayList<>();
for(String ele : split) {
list.add(ele);
}
return list;
}
//完成对逆波兰表达式的运算
public static int calculate(List<String> list) {
Stack<String> stack = new Stack<>();
for(String ele : list) {
//利用正则表达式判断是否是数,是则入栈,不是则取数运算再入栈
if(ele.matches("\\d+")) {
stack.push(ele);
} else {
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
int result = 0;
if(ele.equals("+")) {
result = num1 + num2;
} else if(ele.equals("-")) {
result = num1 - num2;
} else if(ele.equals("*")) {
result = num1 * num2;
} else if(ele.equals("/")) {
result = num1 / num2;
} else {
throw new RuntimeException("非法符号");
}
stack.push(String.valueOf(result));
}
}
//最后留在stack中的数据就是运算结果
return Integer.parseInt(stack.pop());
}
}
但上述的计算器并不完整,需要输入一个后缀表达式,为了更好的使用体验,应该输入中缀表达式,由程序转换成后缀表达式再计算
本文介绍了一种使用栈实现后缀表达式(逆波兰表达式)的计算器,该计算器能够处理基本的算术运算,并提供了从后缀表达式计算结果的具体实现方法。

265

被折叠的 条评论
为什么被折叠?



