conversion from infix to prefix

后端 未结 14 1305
有刺的猬
有刺的猬 2020-12-09 10:24

I am preparing for an exam where i couldn\'t understand the convertion of infix notation to polish notation for the below expression:

(a–b)/c*(d + e – f / g)         


        
14条回答
  •  [愿得一人]
    2020-12-09 10:58

    here is an java implementation for convert infix to prefix and evaluate prefix expression (based on rajdip's algorithm)

    import java.util.*;
    
    public class Expression {
        private static int isp(char token){
            switch (token){
                case '*':
                case '/':
                    return 2;
                case '+':
                case '-':
                    return 1;
                default:
                    return -1;
            }
        }
        private static double calculate(double oprnd1,double oprnd2,char oprt){
            switch (oprt){
                case '+':
                    return oprnd1+oprnd2;
                case '*':
                    return oprnd1*oprnd2;
                case '/':
                    return oprnd1/oprnd2;
                case '-':
                    return oprnd1-oprnd2;
                default:
                    return 0;
            }
        }
        public static String infix2prefix(String infix) {
            Stack OperandStack = new Stack<>();
            Stack OperatorStack = new Stack<>();
            for(char token:infix.toCharArray()){
                if ('a' <= token && token <= 'z')
                    OperandStack.push(String.valueOf(token));
                else if (token == '(' || OperatorStack.isEmpty() || isp(token) > isp(OperatorStack.peek()))
                    OperatorStack.push(token);
                else if(token == ')'){
                    while (OperatorStack.peek() != '(') {
                        Character operator = OperatorStack.pop();
                        String RightOperand = OperandStack.pop();
                        String LeftOperand = OperandStack.pop();
                        String operand = operator + LeftOperand + RightOperand;
                        OperandStack.push(operand);
                    }
                    OperatorStack.pop();
                }
                else if(isp(token) <= isp(OperatorStack.peek())){
                    while (!OperatorStack.isEmpty() && isp(token)<= isp(OperatorStack.peek())) {
                        Character operator = OperatorStack.pop();
                        String RightOperand = OperandStack.pop();
                        String LeftOperand = OperandStack.pop();
                        String operand = operator + LeftOperand + RightOperand;
                        OperandStack.push(operand);
                    }
                    OperatorStack.push(token);
                }
            }
            while (!OperatorStack.isEmpty()){
                Character operator = OperatorStack.pop();
                String RightOperand = OperandStack.pop();
                String LeftOperand = OperandStack.pop();
                String operand = operator + LeftOperand + RightOperand;
                OperandStack.push(operand);
            }
            return OperandStack.pop();
        }
        public static double evaluatePrefix(String prefix, Map values){
            Stack stack = new Stack<>();
            prefix = new StringBuffer(prefix).reverse().toString();
            for (char token:prefix.toCharArray()){
                if ('a'<=token && token <= 'z')
                    stack.push((double) values.get(token));
                else {
                    double oprnd1 = stack.pop();
                    double oprnd2 = stack.pop();
                    stack.push(calculate(oprnd1,oprnd2,token));
                }
            }
            return stack.pop();
        }
        public static void main(String[] args) {
            Map dictionary = new HashMap<>();
            dictionary.put('a',2.);
            dictionary.put('b',3.);
            dictionary.put('c',2.);
            dictionary.put('d',5.);
            dictionary.put('e',16.);
            dictionary.put('f',4.);
            dictionary.put('g',7.);
            String s = "((a+b)/(c-d)+e)*f-g";
            System.out.println(evaluatePrefix(infix2prefix(s),dictionary));
        }
    }
    

提交回复
热议问题