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(); } }