- 要求: 输入一个逆波兰表达式(后缀表达式),使用栈计算结果
- 这里简化,这对整数进行计算
思路分析
- 例如:(3+4)x5-6 对应的后缀表达式就是3 4 + 5 x 6 -,针对后缀表达式求值步骤如下:
- 从左至右扫描,将3和4压入栈中;
- 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值7,再将7入栈;
- 继续扫描,将5入栈;
- 接下来就是x运算符,因此弹出5和7,计算7x5 = 35,将35入栈
- 将6入栈;
- 最后是 - 运算符,计算35-6 = 29的值.
代码实现
public class PolandNotation {
public static void main(String[] args) {
String suffixExpression = "30 4 + 5 * 6 -";
//将后缀表达式保存到ArrayList中
List<String> list = getListString(suffixExpression);
//初始化一个栈
Stack<String> stack = new Stack<>();
//遍历后缀表达式数组
for (String s : list) {
if (s.matches("\\d+")){
stack.push(s);
}else {
//出站两个元素
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
//计算两个数
int res = calculate(num1,num2,s);
//将返回值压栈
stack.push(""+res);
}
}
System.out.printf("计算结果为:%d\n",Integer.parseInt(stack.pop()));
}
/**
*
* @param num1 先出栈的数
* @param num2 后出栈的数
* @param s 操作符
* @return 但会两个数运算后的结果
*/
private static int calculate(int num1, int num2, String s) {
int res = 0;
switch (s){
case "+":
res = num2 + num1;
break;
case "-":
res = num2 - num1;
break;
case "*":
res = num2 * num1;
break;
case "/":
res = num2 / num1;
break;
default:
break;
}
return res;
}
/**
*
* @param suffixExpression 后缀表达式
* @return 返回转换后的list数组
*/
private static List<String> getListString(String suffixExpression) {
List<String> list = new ArrayList<>();
String[] s = suffixExpression.split(" ");
for (String s1 : s) {
list.add(s1);
}
return list;
}
}