gpt4 book ai didi

java - Java中不计算内括号的情况下查找括号的最后一个索引

转载 作者:行者123 更新时间:2023-12-01 22:19:24 25 4
gpt4 key购买 nike

我正在制作一个计算器,而且我对 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 括号内的多个括号。

感谢您提前提供的帮助:)

最佳答案

每当您尝试解决此类问题时,最好的方法是将它们转换为 POSTFIX 表示法。这意味着,运算符将出现在末尾,并且应该应用于它们前面的运算符。此方法最好的部分是,不需要任何括号。运算符优先级是内置的。

示例:

Original Expression: (x + y)*(p/q + r)
POSTFIX notation: x y + p q / r + * (no need of parenthesis)

这是将表达式转换为 POSTFIX 表示法的伪代码。

  1. 维护两个堆栈,一个用于运算符(操作符堆栈),另一个用于操作数(操作数堆栈)
  2. 对表达式的每个单词重复以下内容
    • 如果该字是操作数,则将其放入操作数栈
    • 如果该词是运算符,
      • 如果运算符栈不为空,则检查栈顶运算符的优先级。
        • 如果栈上的运算符优先级较高,则将运算符从栈中弹出,并将其压入操作数栈,将当前运算符压入运算符堆栈。
        • 如果堆栈上的运算符优先级较低,则将运算符压入运算符堆栈
      • 如果运算符为空,则将运算符压入运算符堆栈
  3. 如果所有操作数都完成,则从运算符堆栈中弹出所有运算符,并将它们插入操作数堆栈

现在,一旦解析了表达式,就可以计算表达式了。使用以下伪代码计算 POSTFIX 表达式:

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

留在操作数堆栈上的元素是表达式的结果。

关于java - Java中不计算内括号的情况下查找括号的最后一个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com