中缀表达式计算(用栈实现)

  • Post author:
  • Post category:其他


输入字符串“(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 版权协议,转载请附上原文出处链接和本声明。