2、利用栈计算后缀表达式(逆波兰表达式)
作者:互联网
一、需求分析
1、输入一个逆波兰表达式,利用栈计算其结果;
2、支持小括号和多位数整数;
二、思路分析
例如:(3+5)*5-6对应的后缀表达式为3 5 + 5 * 6 -,其求值步骤如下:
1.从左到右扫描,遇见数字直接入栈,3和5入栈;
2.遇见操作符+,从栈中弹出两个数3和5,根据操作符计算结果为8,并将结果8入栈;
3.将5入栈;
4.遇见操作符*,弹出两个操作符5和8,计算结果为5*8=40,将40入栈;
5.将6入栈;
6.遇见操作符-,弹出两个数字6和40,计算结果为40-6=34,将34入栈;
7.字符串扫描完毕,栈中剩余数字34就是最终答案。
三、代码
package com.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 例如:(3+5)\*5-6对应的后缀表达式为3 5 + 5 \* 6 -,其求值步骤如下:
* 1.从左到右扫描,遇见数字直接入栈,3和5入栈;
* 2.遇见操作符+,从栈中弹出两个数3和5,根据操作符计算结果为8,并将结果8入栈;
* 3.将5入栈;
* 4.遇见操作符*,弹出两个操作符5和8,计算结果为5*8=40,将40入栈;
* 5.将6入栈;
* 6.遇见操作符-,弹出两个数字6和40,计算结果为40-6=34,将34入栈;
* 7.字符串扫描完毕,栈中剩余数字34就是最终答案。
*
* @author chaixf
*
*/
public class PolandNotation {
public static void main(String[] args) {
// 定义逆波兰表达式
String suffixExpression = "3 5 + 5 * 6 -";
// 思路
// 1、先将"3 5 + 5 * 6 -" => ArrayList中
// 2、将ArrayList传给一个方法,结算结果
List<String> list = getListString(suffixExpression);
// 计算结果
int res = calculate(list);
System.out.printf("3 5 + 5 * 6 -的计算结果为:%d",res);
}
public static List<String> getListString(String suffixExpression){
// 将suffixExpression进行分割
String[] split = suffixExpression.split(" ");
// 将split放进ArrayList中
ArrayList<String> arrayList = new ArrayList<String>();
for(String item:split) {
arrayList.add(item);
}
return arrayList;
}
public static int calculate(List<String> list) {
// 创建一个栈
Stack<Integer> stack = new Stack<Integer>();
for(String item:list) {
if(item.matches("\\d+")) {// 匹配到的是数字
stack.push(Integer.parseInt(item));
}else {// 匹配到的是操作符
// 弹出两个数并计算结果
int num2 = stack.pop();
int num1 = stack.pop();
int result = 0;
switch (item) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
default:
throw new RuntimeException("操作符错误!");
}
// 将结果入栈
stack.push(result);
}
}
// 返回栈中的最后一个数据
return stack.pop();
}
}
标签:入栈,后缀,ArrayList,40,操作符,计算结果,波兰,stack,表达式 来源: https://blog.csdn.net/Chaixf8/article/details/114039615