Исправленная часть кода -
static int precedenceOrder(char op) {
switch (op) {
case '(':
return -1;
case '+':
case '-':
return 1;
case '*':
case '/':
case '%':
return 2;
default:
return 0;
}
}
public static boolean isSpace(char c) {
return (c == ' ');
}
public static boolean decidePrecedence(char a, char b) {
return (precedenceOrder(a) >= precedenceOrder(b));
}
public static String infixToPostfix(String infix) {
StringTokenizer t = new StringTokenizer(infix);
String postfix = "";
Stack opStack = new Stack();
while (t.hasMoreTokens()) {
String token = t.nextToken();
char c = token.charAt(0);
if (c == '(') {
opStack.push(c);
} else if (Character.isDigit(c)) {
postfix += (c + " ");
} else if (c == ')') {
while (!opStack.isEmpty() && ! opStack.peek().equals('(')) { // Not added to the second expression
postfix += (opStack.pop() + " ");
}
if (!opStack.isEmpty()) { // changed from while to if.
opStack.pop(); // DOES NOTHING? removes '('
}
}
else {
char topElement;
while (!opStack.empty() && (decidePrecedence((Character) opStack.peek(), c))) {
topElement = (Character) opStack.pop();
if (topElement != '(') {
postfix += (topElement + " ");
}
}
opStack.push(new Character(c));
}
}
while (!opStack.empty()) {
char top = (Character) opStack.pop();
if (top != '(')
postfix += (top + " ");
}
return postfix;
}
public static boolean isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '(' || c == ')' || c == '%';
}
public static double evalPostfix(String postfix) {
// commented this line.
// postfix = postfix.replace(" ", "");
StringTokenizer t = new StringTokenizer(postfix);
Stack opStack = new Stack();
String token;
double op1, op2, result = 0;
while (t.hasMoreTokens()) {
token = t.nextToken();
char c = token.charAt(0);
if (isOperator(c)) {
op2 = (Double) opStack.pop();
op1 = (Double) opStack.pop();
result = evalSingle(c, op1, op2);
opStack.push(new Double(result));
} else {
double pushValue = Double.valueOf(String.valueOf(c));
opStack.push(pushValue);
}
}
result = (Double) opStack.pop();
if (!opStack.isEmpty()) {
throw new IllegalArgumentException("invalid postfix");
}
return result;
}
Почему -1? Позвольте мне ответить, предположим (a + b), то каков статус стека, когда столбец «+» встречается в стеке »(« когда вы добавляете + в стек, который вы пытаетесь выталкивать всех других операторов из стека, которые выше по приоритету чем +, то в этом вы также можете поп '(', потому что вы дали 3, который выше в приоритете. Либо вы должны остановиться на '(' при выборе приоритета или make '(' low ie -1, так что это автоматически меньше или равна той, что вы вносите. вы можете исправить его в обоих направлениях.
следует также избегать Шара (0). вы можете обрезать и получить удвоенное значение
String token = " 9";
Double value = Double.valueOf(token.trim());
накладку () удаляет передние и конечные пробелы и Double.valueOf преобразует String в Double, короче говоря, вы можете прочитать его как «двойное значение String».
Комментарий «ничего не делает» неверен. – EJP
Взгляните на мои комментарии к Сагару У. Если бы на время было необходимое изменение. Все еще не уверен, почему я не могу рассчитать правильный ответ ... моя программа может обрабатывать подобные постышки, но в любой момент, когда есть круглые скобки, связанные с получением там, он не вычисляет правильный результат (все еще работает над этим сам в данный момент , немного тупик, хотя). –
Вот такая мысль: как вы будете реализовывать свой собственный простой механизм regex в java, если вы не хотите конвертировать из infix в postfix? Не использование встроенных библиотек является частью процесса обучения. Разумеется, вам не будет предложено внедрить регулярное выражение в движке в вашей работе, но такие назначения улучшат ваши навыки решения проблем и сделают вас лучшим программистом. Как вы думаете, компилятор оценивает выражения? ;) – rafid059