查找括号的最后一个索引,而不计算Java中的内括号
我正在做一个计算器,我对Java相当陌生。我希望我的计算器能够计算余弦,窦和唐根,这是我正在努力解决的问题 我的主要问题是只计算f.ex。字符串的余弦,如下所示:“cos(10)+(30)”。你可以在下面看到我的代码查找括号的最后一个索引,而不计算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
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一个用于运算符(运算符堆栈),另一个用于操作数(操作数堆栈)
对表达式的每个单词重复以下步骤
- 如果该字是操作数,请将其放入操作数堆栈中
- 如果单词是运算符,
- 如果运算符堆栈不是空的,请检查堆栈顶部运算符的优先级。
- 如果堆栈上的运算符具有更高的优先级,则从堆栈中弹出运算符,并将其推送到操作数堆栈上,然后将当前运算符推送到运算符堆栈中
- 如果堆栈上的运算符优先级较低,则将该运算符按入运算符堆栈
- 如果操作符为空,将操作符推到操作符堆栈上
如果所有操作数都已完成,则从运算符堆栈中弹出所有运算符,并将它们推送到操作数堆栈中
现在,一旦解析了表达式,就可以对表达式求值了。使用以下伪代码计算后缀表达式:
重复此操作,直到堆栈只剩下一个元素(这是结果)
- 从操作数堆栈中弹出顶部元素。
- 如果元件是运算符,则将其推入<