前缀,后缀,中缀表达式

发布时间 2023-03-22 21:13:45作者: 为TT
  1. 前缀表达式又叫波兰表达式,前缀表达式的运算符位于操作数之前
  2. 前缀表达式案例:(3+4)*5-6的前缀表达式为-*+6543
  3.  

     

  4. 中缀表达式:

     

     

  5. 后缀表达式(逆波兰表达式):运算符位于操作数后面

     

     

  6.  

     

  7. 后缀表达式代码;
    package 逆波兰表达式;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;

    public class text1 {
    public static void main(String[] args) {
    //先定义一个逆波兰表达式,为了方便,用空格分隔开
    String s="3 4 + 5 * 6 -";
    //思路:先将3 4 + 5 * 6 -放到一个ArrayList的集合中去
    //将ArrayList传进一个方法,遍历ArrayList配合栈完成计算

    List<String> List =getList(s);
    System.out.println(List);
    int res=calculate(List);
    System.out.println("计算结果为"+res);

    }
    //先定义一个逆波兰表达式,先将3 4 + 5 * 6 -放到一个ArrayList的集合中去
    public static List<String> getList(String s){
    //将s分割
    String[] split = s.split(" ");
    List<String> list =new ArrayList<String>();
    for (String ele:split) {
    list.add(ele);
    }
    return list;
    }
    //计算
    public static int calculate(List<String> list){
    //创建栈
    Stack<String> stack = new Stack<>();
    //遍历list
    for (String item:list){
    if (item.matches("\\d+")){
    stack.push(item);
    }else {
    //pop出两个数和一个符号进行运算
    int num1=Integer.parseInt(stack.pop());
    int num2=Integer.parseInt(stack.pop());
    int res =0;
    if (item.equals("+")){
    res=num1+num2;
    }else if (item.equals("-")){
    res=num2-num1;
    }else if (item.equals("*")){
    res=num1*num2;
    }else if (item.equals("/")){
    res=num2/num1;
    }else {
    throw new RuntimeException("运算符有误");
    }
    stack.push(""+res);
    }

    }
    //返回栈的最后一个结果
    return Integer.parseInt(stack.pop());
    }
    }