输入字符串“(10+20/2*3)/2+8”计算结果
    1.首先我们要将“(10+20/2
    
     3)/2+8”变成
     
     “(,10,+,20,/,2,
    
    ,3,),/,2,+,8”
   
    2.建两个栈,一个用于
    
     操作符
    
    (+,-,…)的入栈出栈(
    
     栈op
    
    )
    
    一个用于
    
     数值
    
    的入栈出栈(
    
     栈nu
    
    )
   
    3.
    
     操作符出栈入栈规则
    
    :
   
- 如果栈op为null直接进栈
- 
     如果栈op的栈顶为“
 
 (
 
 ”直接进栈
- 
     如果栈op的栈顶为
 
 操作符
 
 如“+”等,我们就
 
 判断要进栈的操作符的优先级****是否大于栈顶
 
 的
 
 操作符
 
 优先级,
 
 如果大于就进栈;否者就弹出栈顶
 
 操作符
 
 ,直到栈顶
 
 操作符
 
 优先级小于就进栈
 
 操作符
 
 优先级。
- 
     如果进栈的操作符是“
 
 )
 
 ”就一直将栈顶的操作符弹出;直到栈顶的操作符为“
 
 (
 
 ”结束;
- 最后判断栈op是否为空,如果不是就一直弹出栈顶;
    3.
    
     数字出栈入栈规则
    
    :
   
- 如果是数字直接进栈
- 
     如果
 
 栈op
 
 有弹出的操作符
 
 “?”
 
 ,那么
 
 栈nu
 
 就要 连续弹出栈“
 
 n1
 
 ”和
 
 n2
 
 (
 
 n1比n2先弹出
 
 ),通过某个函数进行计算(
 
 n2 ? n1
 
 ),结果再进入
 
 栈nu
 
 ;
中缀表达式计算(入栈出栈过程)
部分代码(有需要全部代码联系我)
 public static void main(String[] args) {
        String expression = "(10+20/2*3)/2+8";
        try {
            int result = expreess(expression);
            System.out.println(result);
        }catch(Exception e){
            System.out.println("error!");
        }
    }
    private static int expreess(String expression) {
        ArrayStatck<Character> op= new ArrayStatck<>();//操作符栈
        ArrayStatck<Integer> num= new ArrayStatck<>();//数字栈
        expression=formation(expression);//在操作符两侧添加空格
        String[] toke=expression.split(" ");//去除空格,将两个空格之间的字符存入toke数组
        for (String tokes:toke){//循环遍历
            if(tokes.length()==0)
                continue;
            else if(tokes.charAt(0)=='+'||tokes.charAt(0)=='-'){//要进入的是—或+
                while(!op.isEmpty()&&(op.peek()=='+'||op.peek()=='-'||op.peek()=='/'||op.peek()=='*')){
                    operat(op,num);//操作函数
                }
                op.push(tokes.charAt(0));
            }else if(tokes.charAt(0)=='*'||tokes.charAt(0)=='/'){
                while(!op.isEmpty()&&(op.peek()=='/'||op.peek()=='*')){
                    operat(op,num);
                }
                op.push(tokes.charAt(0));
            }else if (tokes.charAt(0)=='('){
                op.push(tokes.charAt(0));
            }else if(tokes.charAt(0)==')'){
                while(op.peek()!='('){
                    operat(op,num);
                }
                op.pop();
            }else{
                num.push(new Integer(tokes));//new Integer(tokes)将字符转化为数
            }
        }
        while(!op.isEmpty()){//栈是否为空,如果不是就一直弹出栈顶
            operat(op,num);
        }
        return  num.pop();
    }
 private static void operat(ArrayStatck<Character> op, ArrayStatck<Integer> num) {
        int num1=num.pop();
        int num2=num.pop();
        char c=op.pop();
        switch(c){
            case '+':num.push(num2+num1);break;
            case '-':num.push(num2-num1);break;
            case '*':num.push(num2*num1);break;
            case '/':num.push(num2/num1);break;
        }
    }
 
版权声明:本文为qq_45726776原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
