Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找括号的最后一个索引,而不计算Java中的内括号_Java - Fatal编程技术网

查找括号的最后一个索引,而不计算Java中的内括号

查找括号的最后一个索引,而不计算Java中的内括号,java,Java,我正在做一个计算器,我对Java相当陌生。我希望我的计算器能够计算余弦,窦和唐根,这是我正在努力解决的问题 我的主要问题是只计算f.ex。字符串的余弦,如下所示:“cos(10)+(30)”。你可以在下面看到我的代码 String formula = "cos(10)+(30)"; if (formula.contains("cos") { String afterCos = (formula.substring(formula.lastIndexOf("cos"), formul

我正在做一个计算器,我对Java相当陌生。我希望我的计算器能够计算余弦,窦和唐根,这是我正在努力解决的问题

我的主要问题是只计算f.ex。字符串的余弦,如下所示:“cos(10)+(30)”。你可以在下面看到我的代码

String formula = "cos(10)+(30)";

if (formula.contains("cos") 
{
     String afterCos = (formula.substring(formula.lastIndexOf("cos"), formula.length()));

    int countOpen = (afterCos.length())-(afterCos.replace("(", "").length());
    int countClosed = (afterCos.length())-(afterCos.replace(")", "").length());

    while (countOpen >= countClosed) 
    {
         if ((countOpen-countClosed) == 0) 
         {
            String inside = afterCos.substring(afterCos.indexOf("(")+1, afterCos.lastIndexOf(")"));
            System.out.println(inside);
        }
        break;
    }
}
在此之后,内的字符串
将为
10)+30
。 我怎样才能使它只关注
10
后面的括号? 另一方面,我还需要它能够处理cos括号内的多个括号


提前感谢您的帮助:)

若要将此字符串“cos(10)+(30)”分隔为cos(10)和(30),您可以使用带+分隔符的StringTokenizer来获取令牌。

若要将此字符串“cos(10)+(30)”分隔为cos(10)和(30),您可以使用带+分隔符的StringTokenizer来获取令牌。

若要将此字符串“cos(10)+(30)”分隔为cos(30)作为cos(10)和(30),您可以使用带有+作为分隔符的StringTokenizer来获取令牌。

要将这个字符串“cos(10)+(30)”作为cos(10)和(30)来分离,您可以使用带有+作为分隔符的StringTokenizer来获取令牌。

每当您试图修复此类问题时,最好的方法是将它们转换为后缀符号。也就是说,操作符将出现在末尾,并且应该应用于它们前面的操作符。这个方法最好的部分是,你不需要任何括号。运算符优先级是内置的

例如:

Original Expression: (x + y)*(p/q + r)
POSTFIX notation: x y + p q / r + * (no need of parenthesis)
下面是将表达式转换为后缀符号的伪代码

  • 维护两个
    堆栈
    s一个用于运算符(运算符堆栈),另一个用于操作数(操作数堆栈)
  • 对表达式的每个单词重复以下步骤
    • 如果该字是操作数,请将其放入操作数堆栈中
    • 如果单词是运算符,
      • 如果运算符堆栈不是空的,请检查堆栈顶部运算符的优先级。
        • 如果堆栈上的运算符具有更高的优先级,则从堆栈中弹出运算符,并将其推送到操作数堆栈上,然后将当前运算符推送到运算符堆栈中
        • 如果堆栈上的运算符优先级较低,则将该运算符按入运算符堆栈
      • 如果操作符为空,将操作符推到操作符堆栈上
  • 如果所有操作数都已完成,则从运算符堆栈中弹出所有运算符,并将它们推送到操作数堆栈中
  • 现在,一旦解析了表达式,就可以对表达式求值了。使用以下伪代码计算后缀表达式:

  • 重复此操作,直到堆栈只剩下一个元素(这是结果)
    • 从操作数堆栈中弹出顶部元素。
      • 如果元素是运算符,则将其推入运算符堆栈
      • 如果元素是操作数,请检查运算符堆栈的顶部。
        • 如果是一元运算符,则弹出运算符堆栈并将该运算符应用于操作数,然后将结果推送到操作数堆栈
        • 如果是二进制运算符,则弹出操作数堆栈(第二个元素)
          • 如果第二个元素是运算符,则将第一个操作数和运算符推送到运算符堆栈上
          • 如果第二个元素是操作数,则弹出运算符堆栈,对两个操作数应用该运算,并将结果推送到操作数堆栈
        • 如果是操作数,则弹出运算符堆栈两次(以获取操作数和二进制运算符),并对两个操作数应用二进制运算。并将结果推入操作数堆栈

  • 操作数堆栈上剩余的元素是表达式的结果。

    无论何时尝试解决此类问题,最好的方法是将它们转换为后缀表示法。也就是说,操作符将出现在末尾,并且应该应用于它们前面的操作符。这个方法最好的部分是,你不需要任何括号。运算符优先级是内置的

    例如:

    Original Expression: (x + y)*(p/q + r)
    POSTFIX notation: x y + p q / r + * (no need of parenthesis)
    
    下面是将表达式转换为后缀符号的伪代码

  • 维护两个
    堆栈
    s一个用于运算符(运算符堆栈),另一个用于操作数(操作数堆栈)
  • 对表达式的每个单词重复以下步骤
    • 如果该字是操作数,请将其放入操作数堆栈中
    • 如果单词是运算符,
      • 如果运算符堆栈不是空的,请检查堆栈顶部运算符的优先级。
        • 如果堆栈上的运算符具有更高的优先级,则从堆栈中弹出运算符,并将其推送到操作数堆栈上,然后将当前运算符推送到运算符堆栈中
        • 如果堆栈上的运算符优先级较低,则将该运算符按入运算符堆栈
      • 如果操作符为空,将操作符推到操作符堆栈上
  • 如果所有操作数都已完成,则从运算符堆栈中弹出所有运算符,并将它们推送到操作数堆栈中
  • 现在,一旦解析了表达式,就可以对表达式求值了。使用以下伪代码计算后缀表达式:

  • 重复此操作,直到堆栈只剩下一个元素(这是结果)
    • 从操作数堆栈中弹出顶部元素。
      • 如果元件是运算符,则将其推入<