将多位数中缀表达式转换为postfix

时间:2016-01-09 09:45:03

标签: java android infix-notation

将中缀转换为后缀表达式的功能代码,如下所示

package swapnil.calcii;

import android.util.Log;

import java.util.Stack;


public class Calculate {


    private static final String operators = "-+/*";
    private static final String operands = "0123456789";

    public int evalInfix(String infix) {
        return evaluatePostfix(convert2Postfix(infix));
    }

    public String convert2Postfix(String infixExpr) {
        char[] chars = infixExpr.toCharArray();
        Stack<String> stack = new Stack<String>();
        StringBuilder out = new StringBuilder(infixExpr.length());

        for (char c : chars) {
            if (isOperator(c)) {
                while (!stack.isEmpty() && !stack.peek().equals("(")) {
                    if (operatorGreaterOrEqual(stack.peek(), c)) {
                        out.append(stack.pop());
                    } else {
                        break;
                    }
                }
                String s = ""+c;
                stack.push(s);
            }
            else if (c == '(') {

                String s = ""+c;
                stack.push(s);
            } else if (c == ')') {
                while (!stack.isEmpty() && !stack.peek().equals("(")) {
                    out.append(stack.pop());
                }
                if (!stack.isEmpty()) {
                    stack.pop();
                }
            } else if (isOperand(c)) {
                try{
                    StringBuilder num = new StringBuilder();
                    while(isOperand(stack.peek().charAt(0))) {
                        num.append(stack.pop());
                        out.append(num);
                    }
                } catch (Exception e) {
                    Log.d("errrr", "error in inserting " + e.getMessage());
                    out.append(c);
                }
                out.append(c);
            }
        }
        while (!stack.empty()) {
            out.append(stack.pop());
        }
        return out.toString();
    }

    public int evaluatePostfix(String postfixExpr) {
        char[] chars = postfixExpr.toCharArray();
        Stack<Integer> stack = new Stack<Integer>();
        for (char c : chars) {
            if (isOperand(c)) {
                stack.push(c - '0'); // convert char to int val
            } else if (isOperator(c)) {
                int op1 = stack.pop();
                int op2 = stack.pop();
                int result;
                switch (c) {
                    case '*':
                        result = op1 * op2;
                        stack.push(result);
                        break;
                    case '/':
                        result = op2 / op1;
                        stack.push(result);
                        break;
                    case '+':
                        result = op1 + op2;
                        stack.push(result);
                        break;
                    case '-':
                        result = op2 - op1;
                        stack.push(result);
                        break;
                }
            }
        }
        return stack.pop();
    }
    private int getPrecedence(char operator) {
        int ret = 0;
        if (operator == '-' || operator == '+') {
            ret = 1;
        } else if (operator == '*' || operator == '/') {
            ret = 2;
        }
        return ret;
    }
    private boolean operatorGreaterOrEqual(String op1, char op2) {
        char op = op1.charAt(0);
        return getPrecedence(op) >= getPrecedence(op2);
    }

    private boolean isOperator(char val) {
        return operators.indexOf(val) >= 0;
    }

    private boolean isOperand(char val) {
        return operands.indexOf(val) >= 0;
    }
}

崩溃,未知错误。 我自己写的,我无法弄清楚我哪里出错了。

函数工作正常,如果在检查isOperand时推送一个char(c) 但是使用StringBuilder来推送多位数会导致代码崩溃。 帮助

0 个答案:

没有答案