Создаю строковый калькулятор, используя алгоритм обратная польская запись. В некоторых случаях код работает, в большинстве случаев работает неправильно. Подскажите, пожалуйста, в чём проблема.
| Код | import java.io.IOException; import java.util.ArrayList; import java.util.Stack; public class Calculator { static String opn = ""; static Stack stack; static int priority; static char temp; static int currentPriority; static double first; static double second; public static void main(String[] args) throws IOException { stack = new Stack(); System.out.println("Enter string: "); String s = DataInput.getString(); /** * Цикл переводит выражение о Обратную Польскую Нотацию. */ for (int i = 0; i < s.length(); i++) { /** * помещение числа в строку * */ if (Character.isDigit(s.charAt(i))) { opn += s.charAt(i); } /** * если на вход приходит символ * */ else if (s.charAt(i) == '+' || s.charAt(i) == '-' || s.charAt(i) == '*' || s.charAt(i) == '/' || s.charAt(i) == '^' || s.charAt(i) == '(' || s.charAt(i) == ')') { /* * if (i > 0 && opn.charAt(opn.length() - 1) != ' ') opn += ' '; * // (1+2)*4+3 // 3 + 4 * 2 / (1 - 5)^2 */ /** * определяется приоритет операции * */ switch (s.charAt(i)) { case '^': priority = 3; break; case '/': priority = 2; break; case '*': priority = 2; break; case '+': priority = 1; break; case '-': priority = 1; break; case '(': priority = 0; break; } /** * если стек пустой * */ if (stack.empty()) { stack.push(s.charAt(i)); } /** * если скобка, помещаем в стек * */ else if (s.charAt(i) == '(') { stack.push(s.charAt(i)); } /** * если закрывающая скобка, то извлекаем символы из стека в * выходную строку до тех пор, пока не встретим в стеке * открывающую скобку * */ else if (s.charAt(i) == ')') { while (!stack.empty()) { if ((Character) stack.peek() == '(') break; if (!stack.empty() && (Character) stack.peek() != '(') { opn += stack.pop(); } } if (!stack.empty() && (Character) stack.peek() == '(') { stack.pop(); } } /** * если стек не пустой, определяется приоритет верхнего символа * стека. * */ else if (!stack.empty()) { temp = (Character) stack.peek(); switch (temp) { case '^': currentPriority = 3; break; case '/': currentPriority = 2; break; case '*': currentPriority = 2; break; case '+': currentPriority = 1; break; case '-': currentPriority = 1; break; case '(': currentPriority = 0; break; } // /** * если находящиеся в нем символы (а находится в нем могут * только знаки операций и открывающая скобка) имеют меньший * приоритет, чем приоритет текущего символа, то помещаем * текущий символ в стек. */ if (currentPriority < priority) { stack.push(s.charAt(i)); } // /** * Если символ, находящийся на вершине стека имеет * приоритет, больший или равный приоритету текущего * символа, то извлекаем символы из стека в выходную строку * до тех пор, пока выполняется это условие */ else if (currentPriority >= priority) { while (!stack.empty()) { temp = (Character) stack.peek(); switch (temp) { case '^': currentPriority = 3; break; case '/': currentPriority = 2; break; case '*': currentPriority = 2; break; case '+': currentPriority = 1; break; case '-': currentPriority = 1; break; case '(': currentPriority = 0; break; } /* * if(currentPriority<priority) break; */ if (currentPriority >= priority) opn += (Character) stack.pop(); else break; } } } } } while (!stack.empty()) { if ((Character) stack.peek() == '(') stack.pop(); else opn += stack.pop(); } System.out.println("Our OPN:" + opn); /** * считаем выражение в ОПН * */ Stack newstack = new Stack(); for (int i = 0; i < opn.length(); i++) { if (Character.isDigit(opn.charAt(i))) { newstack.push(opn.charAt(i)); } double result = 1; if (opn.charAt(i) == '+' || opn.charAt(i) == '-' || opn.charAt(i) == '*' || opn.charAt(i) == '/' || opn.charAt(i) == '^') { String fir = ""; String sec = ""; fir += newstack.pop(); sec += newstack.pop(); first = Double.parseDouble(fir); second = Double.parseDouble(sec); switch (opn.charAt(i)) { case '^': result = Math.pow(second, first); newstack.push(result); break; case '/': newstack.push(second / first); break; case '*': newstack.push(second * first); break; case '+': newstack.push(second + first); break; case '-': newstack.push(second - first); break; } } } System.out.println("Result: " + newstack.peek()); } }
|
|