【发布时间】:2013-12-30 18:25:59
【问题描述】:
我正在使用 Java 开发表达式计算器。我决定先编写一个转换为 postfix 的代码,然后编写一个反向波兰符号计算器。到目前为止,我的计算器运行良好,可以处理任何表达式,包括运算符 + - * / %。
我遇到的问题是它使用空格input.split(" ") 拆分表达式,因此这意味着必须输入表达式( 4 + ( 2 * ( -2 - 1 ) ) ) * 1.5,而我应该能够输入(4+(2*(-2-1)))*1.5。
经过几个小时的修修补补,我现在知道它不能工作正则表达式,但它是否能够编写一个 for 循环,一次循环遍历字符串的两个标记,如果它们都等于一个运算符,那么你可以假设第二个必须是负值。或者如果方程以运算符开头,那么它必须是负值?像这样遍历字符串,直到第二个运算符到达表达式的末尾?
这是我一直在尝试开始尝试的一些代码,但由于我对编程还是很陌生,我似乎无法让它工作。
String expression = "(4+(2*(-2--16)))*-1.5";
ArrayList<String> tokens = new ArrayList<String>();
String orig = null;
String regex = "[-+/*()]+";
String first = Character.toString(expression.charAt(0));
tokens.add(first);
for (int i = 0; i < expression.length(); i++) {
char x = expression.charAt(i);
String a = Character.toString(x);
if (i >= 1){ //Check i is greater than or equal to 1
char y = expression.charAt(i-1);
String b = Character.toString(y);
if(b.matches(regex) && x == '-'){
orig = a;
}else if(orig != null && orig.equals("-")){
System.out.println(orig + a);
tokens.add(orig + a);
orig = null;
}else{
tokens.add(a);
}
}
}
for(String t:tokens){
System.out.print(t+" ");
}
感谢您的帮助,Ciaran。
编辑:
我的问题是如何编写一种方法来拆分数学表达式,该方法在拆分时可以区分“-”作为二元运算符和“-”作为一元运算符?我对遍历字符串并比较两个标记的想法是否正确? – Ciaran Ashton 6 分钟前
我想要达到的目标
我想把String expression = (4+(2*(-2-1)))变成String[] expression = (, 4, (, 2, *, (, -2, -, 1, ), ), )
【问题讨论】:
-
您的具体问题是什么?
-
我如何编写一种方法来拆分数学表达式,在拆分时可以区分'-'作为二元运算符和'-'作为一元运算符?我对遍历字符串并比较两个标记的想法是否正确?
-
顺便说一句,您的循环有错误的条件导致 outofboundexception。我
-
当然-2是两个字符,这也是他一直在问的问题:如何正确分隔。
-
@CiaranAshton 我建议解析而不是模式匹配。解析器可以读取一个“当前字符”和一个“下一个字符”,然后根据组合进行分支 - 例如,如果当前字符是
-,则解析器可以在下一个字符是空格时分支到减法运算符并处理如果下一个字符是数字,它作为数字的一部分。它有点复杂,因为如果-前面的字符是数字,那么我们可能希望始终将-视为运算符,以便4-3是减法表达式,而不是4和-3推送到堆栈上。
标签: java regex loops split calculator