我试图编写一个程序来运行计算器使用反向抛光表示法,我遇到了一些问题,我在代码中有注释解释它们,所以如果有人可以伸出援助之手,我将不胜感激! 我知道它与尝试在堆栈中获得位置-1有关,但我似乎无法解决它。
import java.io.BufferedWriter;
import java.io.IOException;
public class Calculator {
ArrayStack<Integer> stack;
BufferedWriter out;
public Calculator(BufferedWriter out) {
this.out=out;
}
public void processLine( String line ) throws IOException {
stack = new ArrayStack<>();
String [] s = line.split ("\\s+");
int operador1;
int operador2;
int x=0;
String operator;
if (s[0].charAt(0)!='-'){ /if a string starts with a "-" it should be interpreted as a comment/
if (isNumber(item)) {
int c = Integer.parseInt(item);
stack.push(c);
} else {
switch(item){
case "*": /multiplies the last two entries in stack/
operador1= stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2*operador1);
break;
case "/": /divides the last two entries in stack/
operador1= stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2/operador1);
break;
case "+": /sums last two entries in stack/
operador1= stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2+operador1);
break;
case "-": /subtracts last two entries in stack/
operador1= stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2-operador1);
break;
case "%": /divides last two entries in stack/
operador1=stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2%operador1);
break;
case ".": /removes top of stack and writes in output file/
operador1=stack.peek(); /error here ArrayIndexOutOfBoundsException: -1/
stack.pop();
out.write(operador1);
out.newLine();
break;
case "@x": /removes top of stack and puts it in x/
x= stack.peek();
stack.pop();
break;
case "x": /puts x in the stack's top/
stack.push(x);
break;
case "dup": /repeats top of stack in stack/
operador1=stack.peek();
stack.push(operador1);
break;
case "swap": /swaps the last two entries/
operador1=stack.peek();
stack.pop();
operador2=stack.peek();
stack.pop();
stack.push(operador2);
stack.push(operador1);
break;
case "drop": /remove top of stack/
stack.pop();
}
}
}
}
System.out.println(" ");
}
public boolean isNumber (String x){
try{
int y=Integer.parseInt(x);
return true;
} catch (NumberFormatException e){
return false;
}
}
}
答案 0 :(得分:0)
在我看来,你的切割和粘贴可能会有点过快。 您的代码有几个不清楚的地方。很难准确猜测 你需要什么帮助,但如果你有一些你可能想澄清的事情 希望得到更好的帮助:
您的括号数量不匹配。我怀疑System.out.println(" ");
之前的那个是应该去的那个。
你不会遍历字符串数组,只需查看一次即可。这看起来很可疑。
更重要的是,因为您为ArrayStack
每次调用创建一个新的processLine
不清楚你是打算一次只处理一个令牌还是一次处理所有令牌。
您选择的注释语法似乎与否定运算符冲突。我猜这个 如果你想要一次处理所有的令牌,因为操作员不能成功 首先要阅读的内容,但为了便于编码和调试,它并不是最符合您的符号。
item
变量未在任何地方定义。
operator
变量未在任何地方使用。
您没有输入字符串的验证,您是否认为它总是很好 形成的呢?如果是这样的话,那么发布输入也是好的,因为那里是失败的 是设计失败的几个输入。