zoukankan      html  css  js  c++  java
  • 表达式求值

    3+2*3

    4+5*(6-7)

    3*(2*(5-3)+1)/2+8-9*(8-1)

    算数表达式,比如: a*(b+c)/d+e

    如果求值?

    一般的过程是分两步,

    一、将中缀式-》后缀式。

    算法过程是: 

    栈底放‘#’,从左至右逐字读取中缀式:

      a.当当前字符为数字时,直接输出;
    b.当当前字符为"("时,将其压栈;
    c.当当前字符为")"时,则弹出堆栈中最上的"("之前的所有运算符并输出,然后删除堆栈中的"(" ;
    d.当当前字符为运算符时,则依次弹出堆栈中优先级大于等于当前运算符的,输出,再将当前运算符压栈;
    e.当为"#"时,弹出所有栈中的内容输出

    中缀式:a*(b+c)/d+e

    后缀式:abc+*d/e+

    代码实现:

    import java.util.Scanner;
    import java.util.Stack;
    
    public class Poland {
        
        public boolean isOpr(char c){
            if(c=='+'||c=='-'||c=='*'||c=='/'){
                return true;
            }
            return false;
        }
        public int getOprValue(char c){
            if(c=='*'||c=='/'){
                return 3;
            } else if(c=='+'||c=='-'){
                return 2;
            } else if(c=='#'){
                return 0;
            } else if(c=='('){
                return 1;
            } else {
                return 0;
            }
        }
        public String convert(String infixExpression){
            Stack<Character> stack=new Stack<Character>();
            String postfixExpression="";
            stack.push('#');
            postfixExpression="";
            int i=0;
            int n=infixExpression.length();
            while(!stack.isEmpty()){
                for(;i<n;i++){
                    char mychar=infixExpression.charAt(i);
                    if(Character.isWhitespace(mychar)){
                        continue;
                    }
                    else if(Character.isDigit(mychar)||mychar=='.'){
                        if(i+1<=n-1&&Character.isDigit(infixExpression.charAt(i+1))){
                                postfixExpression+=mychar;
                        } else {
                            postfixExpression+=mychar+" ";
                        }
                    } else if(mychar=='('){
                        stack.push(mychar);
                        //System.out.println(Arrays.toString(stack.toArray()));
                    } else if(mychar==')'){
                        char c=stack.pop();
                        while(c!='('){
                            postfixExpression+=c+" ";
                            c=stack.pop();
                        }
                        //System.out.println(Arrays.toString(stack.toArray()));
                    } else if(isOpr(mychar)){
                        if(mychar=='-'){
                            int j=i-1;
                            if(j<0){
                                postfixExpression+=mychar;
                                continue;
                            }
                            char tc=infixExpression.charAt(j);
                            while(Character.isSpaceChar(tc)){
                                j--;
                                if(j<0)break;
                                tc=infixExpression.charAt(j);
                            }
                            if(j<0||tc=='('||isOpr(tc)){
                                postfixExpression+=mychar;
                                continue;
                            }
                        }
                        char c=stack.pop();
                        if(getOprValue(mychar)<=getOprValue(c))
                        while(getOprValue(mychar)<=getOprValue(c)){
                            postfixExpression+=c+" ";
                            c=stack.pop();
                        }
                        stack.push(c);
                        stack.push(mychar);
                        //System.out.println(Arrays.toString(stack.toArray()));
                    }
                }
                char cc=stack.pop();
                if(cc!='#'){
                    postfixExpression+=cc+" ";
                }
            }
            return postfixExpression;
        }
        private boolean isOpr2(String opr){
            if(opr.equals("+")||opr.equals("-")||opr.equals("/")||opr.equals("*")){
                return true;
            }
            return false;
        }
        private String doCalculate(String str1, String str2, String opr){
            double a=Double.parseDouble(str1);
            double b=Double.parseDouble(str2);
            double c=0;
            if(opr.equals("+")){
                c=a+b;
            } else if(opr.equals("-")){
                c=b-a;
            } else if(opr.equals("*")){
                c=a*b;
            } else if(opr.equals("/")){
                c=b/a;
            }
            //System.out.println(str2+opr+str1+"=="+c);
            return c+"";
        }
        public void calculate(String postfixExpr){
            Stack<String> stack=new Stack<String>();
            stack.push("#");
            String s[]=postfixExpr.split(" ");
            for(int i=s.length-1;i>=0;i--){
                stack.push(s[i]);
            }
            Stack<String> stack2=new Stack<String>();
            while(!stack.isEmpty()){
                String str=stack.pop();
                if(str.equals("#")){
                    break;
                }
                while(!isOpr2(str)){
                    stack2.push(str);
                    str=stack.pop();
                }
                String str1,str2;
                str1=stack2.pop();
                str2=stack2.pop();
                stack2.push(doCalculate(str1,str2,str));
            }
            System.out.println(stack2.pop());
        }
        public static void main(String args[]){
            Poland po=new Poland();
            Scanner sc=new Scanner(System.in);
            while(sc.hasNext()){
                String str=sc.nextLine();
                String pos="";
                pos=po.convert(str.trim());
                System.out.println(pos);
                po.calculate(pos);
            }
        }
    }
  • 相关阅读:
    [django]django models最佳实战
    [vue]模拟移动端三级路由: router-link位置体现router的灵活性
    [js]顶部导航和内容区布局
    [django]django查询最佳实战
    [vue]webpack使用样式
    [vue]webpack中使用组件
    [vue]组件的导入
    [django]django权限简单实验
    [django]前后端分离之JWT用户认证
    [django]drf知识点梳理-权限
  • 原文地址:https://www.cnblogs.com/gaoqichao/p/2646454.html
Copyright © 2011-2022 走看看