在java中使用堆栈和post fix表示法计算sin、cos和log

在java中使用堆栈和post fix表示法计算sin、cos和log,java,stack,Java,Stack,我想写一个程序,把一个中缀字符串改成后缀,然后计算后缀并打印答案;对于+-*/^很容易,只需要运算符的优先级,但我不知道如何处理sin-cos log和其他数学函数 private static String infixToPostfix(String infix) { String[] exp = infix.split(""); Stack<String> stack = new Stack<>(); String result = "";

我想写一个程序,把一个中缀字符串改成后缀,然后计算后缀并打印答案;对于+-*/^很容易,只需要运算符的优先级,但我不知道如何处理sin-cos log和其他数学函数

private static String infixToPostfix(String infix) {

    String[] exp = infix.split("");
    Stack<String> stack = new Stack<>();
    String result = "";
    for (int i = 0; i < exp.length; i++){

        if (exp[i].equals("(")) {
                stack.push(exp[i]);
        }
        else if (isOperator(exp[i]))
        {
            while (!stack.isEmpty() && precedence(exp[i]) <= precedence(stack.getTop())){
                result += stack.pop() + " ";

            }
            stack.push(exp[i]);
        }
        else if (exp[i].equals(")"))
        {
            while (!stack.isEmpty() && !stack.getTop().equals("(")){
                result += stack.pop() + " ";
            }
            stack.pop();
        }
        else if (Character.isLetterOrDigit(infix.charAt(i)) || exp[i].equals(".")){
            boolean haveDot = exp[i].equals(".");
            String temp = haveDot ? "0." : exp[i];
            while ((i + 1) < exp.length && (Character.isLetterOrDigit(infix.charAt(i + 1)) || exp[i + 1].equals("."))){

                temp += exp[i + 1];
                i++;
            }
            result += temp + " ";
        }
    }
    while (!stack.isEmpty()){
        result += stack.pop() + " ";
    }
    return result;
}
私有静态字符串infixToPostfix(字符串中缀){
字符串[]exp=infix.split(“”);
堆栈=新堆栈();
字符串结果=”;
对于(int i=0;i而(!stack.isEmpty()&&priority(exp[i])检查java.lang.Match类,如果这正是您要查找的……1.java.lang.Math.sin()方法:是一个内置方法,它返回作为参数传递的值的正弦值。2.java.lang.Math.cos():是一个内置方法,返回作为参数传递的值的余弦。3.Java.lang.Math.tan():是一个内置方法,返回作为参数传递的值的正切值。您必须将
sin
cos
等视为一元运算符。您需要找到可以处理一元运算符的中缀到后缀转换器。您遇到了什么问题?解析类似
sin(30)的表达式有困难吗
?或者您在将其转换为后缀时遇到问题吗?如前一条评论所述,您希望修改转换器程序,使
sin
(和其他)是一元运算符。这与处理负数的方式没有根本区别,如
7*(-5)
。基本上,您可以定义新的运算符并修改实现来处理它们。如果您编辑问题以包含中缀到后缀转换器的代码,我们可能会向您显示需要进行的修改。您是否在调试器中单步执行程序以查看出错的地方?如果您不知道如何处理我们的问题e调试器,现在是学习的最佳时机。
private static Double postFixEvaluator(String[] postFix) {
    Stack<Double> operands = new Stack<>();
    double value = 0.0;
    for (int str = 0; str < postFix.length; str++) {
        if (postFix[str].trim().equals("")) {
            continue;
        }
        switch (postFix[str]) {

            case "+":
            case "-":
            case "*":
            case "/":
            case "^":
                Double right = operands.pop();
                Double left = operands.pop();
                long intValue = 0;
                switch (postFix[str]) {
                    case "+":
                        value = left + right;
                        break;
                    case "-":
                        value = left - right;
                        break;
                    case "*":
                        value = left * right;
                        break;
                    case "/":
                        value = left / right;
                        break;
                    case "^":
                        value = Math.pow(left, right);
                        break;
                    default:
                        break;
                }
            case "sin":
            case "cos":
            case "tan":
            case "cot":
                if (Character.isLetterOrDigit(Arrays.toString(postFix).charAt(str + 2))) {
                    str++;
                    break;
                }
                else{
                    Double oper = operands.pop();
                    switch (postFix[str]) {
                        case "sin":
                            value = Math.sin(oper);
                            break;
                        case "cos":
                            value = Math.cos(oper);
                            break;
                        case "tan":
                            value = Math.tan(oper);
                            break;
                        case "cot":
                            value = 1 / Math.tan(oper);
                            break;
                    }
                }

                operands.push(value);
                break;
            default:
                operands.push(Double.parseDouble(postFix[str]));
                break;
        }
    }
    return operands.pop();
}