这是迄今为止我的代码:
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();
}
}
我想我已经掌握了它的基础知识,但是如何处理连续三位或更多数字的后缀计算,例如“2 3 4 * -”?任何帮助,将不胜感激。提前致谢!
最佳答案
是的,一个堆栈。人们可以使用数组和计数器轻松实现一个简单的堆栈 - 不需要使用花哨的类。
该数组将与您可以处理的最深嵌套表达式一样大(10 个元素应该足以解决几乎所有“真实”问题)。
推送是更新 A[i] 并增加 i。 Pop 是递减 i 并引用 A[i]。 “8 9 +”就是push(8),push(9),弹出最上面的两个元素,相加,压入结果。请注意,运算符永远不会推送,只会推送操作数/结果。
'2 3 4 * -' 将是推(2)、推(3)、推(4)、弹出前两个、乘法、插入结果、弹出两个、减法、插入结果。
“7 6 + cos”将是push(7)、push(6)、弹出2、添加、推送结果、弹出1、执行“cos”、推送结果。
如果您需要弹出一个元素并且计数器为零(例如,“7 +”——您想要弹出两次,但只能弹出一次),则会出错。如果用户表示“完成”并且堆栈中有多个元素,也会出现错误。
始终“显示”顶部元素,因为这是最后推送的值或结果。
关于java - Postfix计算器,如何处理连续3个数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906700/