如何在带有中缀后缀符号的计算器中添加三角函数?JAVA

如何在带有中缀后缀符号的计算器中添加三角函数?JAVA,java,Java,我想做的是一个计算器,他们让我创建所有代码,我只能使用堆栈、队列或数学之类的库,但我不能使用已经解决了这个练习的库作为脚本,这就是为什么我选择使用中缀后缀符号,但最后我不知道如何添加三角函数 代码: 这是我或多或少想要计算的字符串,考虑到它必须用任何字符串来解析: String a = "((1 + 2)^2 / (2 * 3)) + #(2 ^ (1 / 2))"; 这与写作是一样的: String a = "((1 + 2)^2 / (2 * 3)) + co

我想做的是一个计算器,他们让我创建所有代码,我只能使用堆栈、队列或数学之类的库,但我不能使用已经解决了这个练习的库作为脚本,这就是为什么我选择使用中缀后缀符号,但最后我不知道如何添加三角函数

代码:

这是我或多或少想要计算的字符串,考虑到它必须用任何字符串来解析:

String a = "((1 + 2)^2 / (2 * 3)) + #(2 ^ (1 / 2))";
这与写作是一样的:

String a = "((1 + 2)^2 / (2 * 3)) + cos(2 ^ (1 / 2))";
最后,操作在哪里,我添加了一个案例,比如说#是cos,我希望它能解决它,但事实是我不知道如何解决:

public double evaluatePostfix(String postfixExpr) 
{
    char[] chars = postfixExpr.toCharArray();
    Stack<Double> stack = new Stack<Double>();
    for (char c : chars) 
    {
        if (isOperand(c)) 
            stack.push((double)(c - '0')); // convert char to int val
        else if (isOperator(c)) 
        {
            double op1 = stack.pop();
            double op2 = stack.pop();
            double 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;
                case '^':
                    result = Math.pow(op2, op1);
                    stack.push(result);
                    break;
                case '#':
                    result = Math.cos(op1);
                    stack.push(result);
                    break;
            }
        }
    }
    return stack.pop();
}
public-double-evaluatePostfix(字符串postfix-expr)
{
char[]chars=postfixExpr.toCharArray();
堆栈=新堆栈();
for(char c:chars)
{
if(等规数(c))
stack.push((双精度)(c-'0');//将字符转换为int val
else if(等温器(c))
{
double op1=stack.pop();
double op2=stack.pop();
双重结果;
开关(c)
{
案例“*”:
结果=op1*op2;
stack.push(结果);
打破
案例“/”:
结果=op2/op1;
stack.push(结果);
打破
格“+”:
结果=op1+op2;
stack.push(结果);
打破
案例'-':
结果=op2-op1;
stack.push(结果);
打破
案例‘^’:
结果=数学功率(op2,op1);
stack.push(结果);
打破
案例“#”:
结果=Math.cos(op1);
stack.push(结果);
打破
}
}
}
返回stack.pop();
}
但它根本就不是这样工作的。 还告诉他们,如果有一种方法可以直接以我选择的特殊字符的形式编写cos(),它将对我有更大的帮助。
如果您需要任何澄清,请告诉我,非常感谢。

我认为您应该做的第一件事是在弹出操作数之前查看运算符,并确定该特定运算符要弹出多少个操作数。也许你可以编写一个
isUnaryOperator
函数,它类似于你的
isOperator
函数。我想到给cos、sen、tan-as-cos->#、sin->$和tan->%赋予特殊字符,你可以在你的程序中这样做。换句话说,在解析字符串之前,将“cos”更改为“#”。但是,您将在某个时候用完特殊字符。那么@tgdavies的想法将是有用的。@tgdavies您能告诉我如何抽象您所说的吗?事实上,我愿意改变你告诉我的,但首先我必须更好地理解你,非常感谢你much@GilbertLeBlanc不用担心,我对字符串的更改没有问题,但我现在最需要的是理解如何在计算器中进行三角运算
String a = "((1 + 2)^2 / (2 * 3)) + cos(2 ^ (1 / 2))";
public double evaluatePostfix(String postfixExpr) 
{
    char[] chars = postfixExpr.toCharArray();
    Stack<Double> stack = new Stack<Double>();
    for (char c : chars) 
    {
        if (isOperand(c)) 
            stack.push((double)(c - '0')); // convert char to int val
        else if (isOperator(c)) 
        {
            double op1 = stack.pop();
            double op2 = stack.pop();
            double 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;
                case '^':
                    result = Math.pow(op2, op1);
                    stack.push(result);
                    break;
                case '#':
                    result = Math.cos(op1);
                    stack.push(result);
                    break;
            }
        }
    }
    return stack.pop();
}