Java 后缀计算器,如何处理连续3个数字?
以下是我目前的代码:Java 后缀计算器,如何处理连续3个数字?,java,illegalargumentexception,postfix-notation,Java,Illegalargumentexception,Postfix Notation,以下是我目前的代码: public class PostfixCalculator { private Stack<Float> stack; private float result; private Boolean isOperator (char op){ boolean operator; switch (op){ case '+': case '-': case '*':
public class PostfixCalculator {
private Stack<Float> stack;
private float result;
private Boolean isOperator (char op){
boolean operator;
switch (op){
case '+':
case '-':
case '*':
case '/':
case '^':
operator = true;
break;
default:
operator = false;
break;}
return operator;
}
private Boolean isFunction (String func){
String[] functions = {"sin", "cos", "max"};
for (int i=0; i<functions.length; i++){
if (func.equals(functions[i]))
return true; }
return false;
}
private void computeOperator (float op1, float op2, char op){
switch (op){
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '/':
result = op1/op2;
break;
case '*':
result = op1 * op2;
break;
case '^':
result = (float) Math.pow(op1, op2);
break;
default:
break;
}
}
public float calculate(String expr) throws IllegalArgumentException {
result = 0;
String token;
Float makeit;
char operator;
float op1, op2, pushFloat;
StringTokenizer calc=new StringTokenizer(expr);
stack = new Stack<Float>();
while (calc.hasNextToken()){
token=calc.getNextToken();
operator=token.charAt(0);
if (!(this.isOperator(operator))){
if (this.isFunction(token)){
if (token.equals("sin")){
op1=stack.pop();
result = (float) Math.sin(op1);
stack.push(result);
}
else if (token.equals("cos")){
op1=stack.pop();
result = (float) Math.cos(op1);
stack.push(result);
}
else if (token.equals("max")){
op1=stack.pop();
op2=stack.pop();
result=Math.max(op1, op2);
stack.push(result);
}
}
else {
makeit = new Float(token);
pushFloat = makeit.floatValue();
stack.push(pushFloat);
}
}
else {
op1 = stack.pop();
op2 = stack.pop();
computeOperator (op1, op2, operator);
stack.push(result);
}
}
return stack.pop();
}
公共类后缀计算器{
私有堆栈;
私人浮动结果;
专用布尔等运算符(字符op){
布尔算子;
开关(op){
格“+”:
案例'-':
案例“*”:
案例“/”:
案例‘^’:
运算符=真;
打破
违约:
运算符=false;
中断;}
返回运算符;
}
私有布尔函数(字符串函数){
字符串[]函数={“sin”、“cos”、“max”};
对于(inti=0;i对于这样的计算器,应该使用堆栈。每个数字都是一个推送,每个操作都有相应的操作
st = []
while input:
if isanumber(input.next()): st.push(input.consume())
else: #its an operator
#note this may be wrong for operators that have a specific order
if(input.next() == "+"):
stack.push(stack.pop() + stack.pop())
# more operations
input.consume()
print(st)
这将是一个粗略的python操作,在这个例子中,我在做决定之前先看一个标记
编辑:
可能应该在发布之前阅读您的代码,无论如何,您必须始终回推计算出的数字,并尝试将代码简化为“函数”和“数字”制作同时执行.Regex和.Regex的函数对于这类事情也很有用,例如.Regex是的,一个堆栈。而且可以使用数组和计数器轻松实现一个简单的堆栈——不需要使用复杂的类
数组将与您可以处理的嵌套最深的表达式一样大(10个元素应该足以处理几乎所有“真实”问题)
Push是update A[i]和increment i。Pop是decreation i,reference A[i]。“8 9+”是Push(8),Push(9),弹出最上面的两个元素,将它们相加,推送结果。请注意,永远不会推送运算符,只推送操作数/结果
“2 3 4*-”将是推(2),推(3),推(4),弹出顶部2,乘法,推结果,弹出2,减法,推结果
“7 6+cos”将是推(7),推(6),弹出两个,添加,推结果,弹出一个,执行“cos”,推结果
如果您需要弹出一个元素且计数器为零(例如,“7+”——您希望弹出两次,但只能弹出一次),则会出现错误。如果用户表示“已完成”,并且堆栈中有多个元素,则也会出现错误
始终“显示”顶部元素,因为这是最后一次推送的值或结果。谢谢您的帮助。我已经实现了一个堆栈,我正在按我认为的顺序推送它,但出于某种原因,2 3 4*-正在执行4-(2*3)取而代之的是,在我检查它是函数还是运算符后,我将令牌推入堆栈,但我是否跳过了某些操作或以错误的顺序进行了操作?@Akaraka-听起来(没有试图破译您的代码)您正在推送运算符(或函数)使用此方案,您永远不会推送运算符/函数——只推送值。(并且,正如另一篇文章所指出的,您对待运算符和函数完全相同。)我查看了我的代码,我认为我没有将运算符/函数放入堆栈,因为我在放入堆栈之前先检查它是函数还是运算符……我是否忽略了什么?谢谢你的帮助!@Akaraka--看一下你的代码,我没有看到任何明显的东西。(但请看我的建议。)您应该专注于为什么在识别“*”后不立即计算(3*4)例如,添加几个System.out.println调用以遵循代码的操作。为了统一性/可理解性,result
应该是本地的,computeOperator
应该返回分配给result
的值。它有两个函数——computeMonadic和computeDiadic。处理max和您的“运算符”在computeDiadic中。用isMonadic或isDiadic替换等运算符。(无需使用字符——只需将所有运算符/函数名视为字符串。)如果你想变得有趣,你可以拥有一个操作符类或诸如此类的类,并为你拥有的每个操作符/函数创建子类。构建一个操作符子类数组并对其进行索引,以找到你的操作。(但这将是“额外的学分”。)