package 数据结构;
import java.util.Stack;
/**
* @program: java_每天一题
* @description: 使用栈实现逆波兰表达式(后缀表达式)计算器
* 思路:遇到符号,就弹出两个元素进行运算,将运算结果入栈,继续遍历下一位
* 遍历完成后,栈中只有一个元素,即是运算结果
*
* 中缀表达式(3+4)*5-6转后缀表达式 3 4 + 5 * 6 -
* @author: czg
* @create: 2020-05-16 10:42
*/
public class j_栈_逆波兰表达式_计算器 {
public static void main(String[] args) {
System.out.println(evalRPN(new String[]{"1","2", "3", "+","4", "*", "+", "5", "-"}));
}
//判断是否是符号
public static boolean isSign(String sign){
return "+-*/".contains(sign);
}
/**
* 进行计算
* @param left 左边数值
* @param right 右变数字
* @param sign 运算符
* @return
*/
public static int compute(int left,int right,String sign){
int result=0;
switch (sign){
case "+": result=left+right;break;
case "-": result=left-right;break;
case "*": result=left*right;break;
default: result=left/right;break;
}
return result;
}
public static int evalRPN(String[] tokens) {
//创建一个栈
Stack<Integer> st=new Stack<>();
for (String token : tokens) {
//如果遇到符号就弹出栈顶两个数字进行求和
if(isSign(token)){
//先右在左数值
int right=st.pop();
int left=st.pop();
//将计算结果放回栈中
st.push(compute(left,right,token));
}else {
//遇到数字直接放到栈中
st.push(Integer.parseInt(token));
}
}
//当计算完成时,栈中只剩下一个数,即为结果
return st.pop();
}
}