首页 > 代码库 > 表达式求值

表达式求值

表达式求值的步骤:

  1.将中缀表达式改为后缀表达式

  2.后缀表达式求值

 

第一个问题:将中缀表达式改为后缀表达式

  》准备2个堆栈(后缀表达式栈、运算符栈)

  》读取中缀表达式的每个对象,对不同对象按不同的情况处理

    1.运算数:直接输出

    2.左括号:压入堆栈

    3.右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈不输出)

    4.运算符:

      a.若优先级大于栈顶运算符时,则进行压栈

      b.若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈

 

技术分享

package com.wpr.courseDemo1;import java.util.Stack;public class Calculate {    //运算符的优先关系        //‘+‘, ‘-‘, ‘*‘, ‘/‘, ‘(‘, ‘)‘        static char OprRelation[][] =   {{‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘+‘                                 {‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘}, //‘-‘                                 {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘*‘                                 {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘}, //‘/‘                                 {‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘<‘, ‘=‘}, //‘(‘                                 {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘=‘, ‘>‘} //‘)‘                                 };             //判断是否为运算符,暂时只支持+-*/()    static boolean isOperator(char c){        if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘||c==‘(‘||c==‘)‘){            return true;        }        return false;    }        //将运算符转化为数组下标以便进行优先级比较      static int ConvertToIndex(char opr)        {            int index = -1;             switch (opr)            {            case ‘+‘:                index = 0;                break;            case ‘-‘:                index = 1;                break;            case ‘*‘:                index = 2;                break;            case ‘/‘:                index = 3;                break;            case ‘(‘:                index = 4;                break;            case ‘)‘:                index = 5;                break;            }            return index;        }        //运算符优先级比较      static char precede(char opr1, char opr2)        {            int index1 = ConvertToIndex(opr1);            int index2 = ConvertToIndex(opr2);            return OprRelation[index1][index2];        }        static Stack<Character> postfix = new Stack<>();    static Stack<Character> oper = new Stack<>();        public static void main(String args[]) {        String str = "2*(9+6/3-5)+4";        char[] s =str.toCharArray();        for(char c:s){            //分4种情况讨论            if(!isOperator(c)){                //No1.运算数类型,直接压栈                postfix.push(c);            }else{                //运算符类型                if(‘(‘==c){                    //No2.遇到左括号,直接压栈                    oper.push(c);                }else if(‘)‘==c){                    //No3.遇到右括号                    char temp = oper.pop();                    while(temp!=‘(‘){                        postfix.push(temp);                        temp = oper.pop();                    }                }else{                    //No4.遇到了运算符                    operNG(c);                }            }        }        while(!oper.isEmpty()){            postfix.push(oper.pop());        }        //显示一下后缀表达式        for(char c:postfix){            System.out.print(c+"\t");        }    }    //处理算术符的优先级不大于栈顶的优先级的情况    static void operNG(char c){        if(oper.isEmpty()){            //如果栈是空的            oper.push(c);        }else{            //栈不空            char temp = oper.peek();//得到栈顶元素但不删除            if(precede(temp, c)==‘<‘){                //栈顶元素优先级<当前运算符的优先级                oper.push(c);            }else{                postfix.push(oper.pop());                operNG(c);            };        }    }}

以上则完成了将中缀表达式化为后缀表达式

 

表达式求值