使用 2 个堆栈评估无符号整数的中缀表达式并得到错误答案
Evaluating infix expressions of unsigned integers using 2 stacks and getting wrong answer
我正在为 class 编写一个程序,正如标题所说,它使用两个堆栈计算无符号整数的中缀表达式。除法应该是整数除法,这就是为什么数字是整数而不是双精度的原因。我已经创建了一个 GUI,它从用户那里获取输入并且应该 return 答案。我已将 ActionListener 附加到按钮以使用此代码进行计算:
result = Evaluate.evalExp(txtExp.getText());
txtResult.setText(result + "");
问题是,当我 运行 程序时,我没有得到正确的答案。
对于 3-4 我会得到 3,对于 6/2 我会得到 2,对于任何有括号的答案我都会得到 0。在一天的大部分时间里,我一直在努力解决这个问题,但没有任何结果。我希望这里有人能够提供帮助。
import java.util.Stack;
public class 评估 {
public static int evalExp(String input) {
char[] tokens = input.toCharArray();
Stack<Integer> number = new Stack<Integer>();
Stack<Character> operator = new Stack<Character>();
int holder = 0;
int ans;
for (int i=0; i < tokens.length; i++) {
// checking to see if token is a number
if (tokens[i] >= '0' && tokens[i] <= '9') {
StringBuffer num = new StringBuffer();
// need to check if number is more than one digit long
while ( i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
num.append(tokens[i++]);
number.push(Integer.parseInt(num.toString()));
}
else if (tokens[i] == '(')
operator.push(tokens[i]);
else if (tokens[i] == ')') {
while (operator.peek() != '(') {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
operator.pop();
}
else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/') {
// check for precedence
while (!operator.empty() && hasPrecedence(tokens[i], operator.peek())) {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
operator.push(tokens[i]);
}
} // end for loop
while (!operator.empty()) {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
ans = number.pop();
return ans;
} // end of evalExp
// checks to see which operand has a higher precedence if any
public static boolean hasPrecedence(char op1, char op2) {
if (op2 == '(' || op2 == ')')
return false;
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-'))
return false;
else
return true;
} // end hasPrecedence
// return result of operator and operands
public static int applyOp(char op, int b, int a) {
int ans = 0;
switch (op) {
case '+': ans = (a + b);
// return ans;
break;
case '-': ans = (a - b);
// return ans;
break;
case '*': ans = (a * b);
// return ans;
break;
case '/': ans = (a / b);
if (b == 0)
throw new ArithmeticException("Cannot divide by zero");
// return ans;
break;
}
return ans;
} //end applyOp
} //结束Class 评估
调试同样的东西会给你答案。
while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
{
num.append(tokens[i++]);
}
在这段代码中,当你执行 i++ 时,你增加了 i 的值,但没有处理那边的 char,它在你的用例中是一个运算符。
while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
{
num.append(tokens[i++]);
}
if (i != tokens.length)
i--;
恢复索引的增量修复了这个问题。这可能不是正确的解决方案。只是想展示增加索引的影响。
我正在为 class 编写一个程序,正如标题所说,它使用两个堆栈计算无符号整数的中缀表达式。除法应该是整数除法,这就是为什么数字是整数而不是双精度的原因。我已经创建了一个 GUI,它从用户那里获取输入并且应该 return 答案。我已将 ActionListener 附加到按钮以使用此代码进行计算:
result = Evaluate.evalExp(txtExp.getText());
txtResult.setText(result + "");
问题是,当我 运行 程序时,我没有得到正确的答案。 对于 3-4 我会得到 3,对于 6/2 我会得到 2,对于任何有括号的答案我都会得到 0。在一天的大部分时间里,我一直在努力解决这个问题,但没有任何结果。我希望这里有人能够提供帮助。
import java.util.Stack;
public class 评估 {
public static int evalExp(String input) {
char[] tokens = input.toCharArray();
Stack<Integer> number = new Stack<Integer>();
Stack<Character> operator = new Stack<Character>();
int holder = 0;
int ans;
for (int i=0; i < tokens.length; i++) {
// checking to see if token is a number
if (tokens[i] >= '0' && tokens[i] <= '9') {
StringBuffer num = new StringBuffer();
// need to check if number is more than one digit long
while ( i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
num.append(tokens[i++]);
number.push(Integer.parseInt(num.toString()));
}
else if (tokens[i] == '(')
operator.push(tokens[i]);
else if (tokens[i] == ')') {
while (operator.peek() != '(') {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
operator.pop();
}
else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/') {
// check for precedence
while (!operator.empty() && hasPrecedence(tokens[i], operator.peek())) {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
operator.push(tokens[i]);
}
} // end for loop
while (!operator.empty()) {
holder = applyOp(operator.pop(), number.pop(), number.pop());
number.push(holder);
}
ans = number.pop();
return ans;
} // end of evalExp
// checks to see which operand has a higher precedence if any
public static boolean hasPrecedence(char op1, char op2) {
if (op2 == '(' || op2 == ')')
return false;
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-'))
return false;
else
return true;
} // end hasPrecedence
// return result of operator and operands
public static int applyOp(char op, int b, int a) {
int ans = 0;
switch (op) {
case '+': ans = (a + b);
// return ans;
break;
case '-': ans = (a - b);
// return ans;
break;
case '*': ans = (a * b);
// return ans;
break;
case '/': ans = (a / b);
if (b == 0)
throw new ArithmeticException("Cannot divide by zero");
// return ans;
break;
}
return ans;
} //end applyOp
} //结束Class 评估
调试同样的东西会给你答案。
while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
{
num.append(tokens[i++]);
}
在这段代码中,当你执行 i++ 时,你增加了 i 的值,但没有处理那边的 char,它在你的用例中是一个运算符。
while (i < tokens.length && tokens[i] >= '0' && tokens[i] <= '9')
{
num.append(tokens[i++]);
}
if (i != tokens.length)
i--;
恢复索引的增量修复了这个问题。这可能不是正确的解决方案。只是想展示增加索引的影响。