/
GermanezZ
/
JavaExercises
Обзор
Документация
Войти
/
GermanezZ
/
JavaExercises
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
AllMetanitLessons/OpenCode/_4th.java
139 строк
4 KB
germa
Уроки по Metanit
04 дек 2024, 20:39
04 дек 2024, 20:39
48d575a
Код
Авторство
О чём код?
package AllMetanitLessons.OpenCode; import java.util.Scanner; import java.util.Stack; /*Прочитать с экрана консоли математическое выражение, которое содержит цифры, знаки +,-,*,/. Вычислить выражение с учетом приоритета операций. К примеру введено 10+3*7. Ответ 31.*/ public class _4th { public static void main(String[] args) { Scanner in = new Scanner(System.in); String expression = in.nextLine(); System.out.println(new Calculator().decide(expression)); } } class Calculator{ public double decide(String expression){ String prepared = preparingExpression(expression); String rpn = ExpressionToRPN(prepared); return rpnToAnswer(rpn); } private String preparingExpression(String expression){ String preparedExpression = new String(); for (int token = 0; token < expression.length(); token++){ char symbol = expression.charAt(token); if (symbol == '-'){ if (token == 0) preparedExpression += '0'; else if (expression.charAt(token-1) == '(') preparedExpression+='0'; } preparedExpression+=symbol; } return preparedExpression; } private String ExpressionToRPN(String Expr){ String current = ""; Stack<Character> stack = new Stack<>(); int priority; for (int i = 0; i< Expr.length();i++){ priority = getPriority(Expr.charAt(i)); if (priority == 0) current += Expr.charAt(i); if (priority == 1) stack.push(Expr.charAt(i)); if (priority > 1){ current+=' '; while (!stack.empty()){ if (getPriority(stack.peek()) >= priority) { current += stack.pop(); } else break; } stack.push(Expr.charAt(i)); } if (priority == -1){ current+=' '; while (getPriority(stack.peek()) != 1) { current += stack.pop(); } stack.pop(); } } while (!stack.isEmpty()) { current += stack.pop(); } return current; } private double rpnToAnswer(String rpn){ String operand; Stack<Double> stack = new Stack<>(); for (int i = 0; i< rpn.length(); i++){ if (rpn.charAt(i) == ' ' ) continue; if (getPriority(rpn.charAt(i)) == 0){ operand = new String(); while (rpn.charAt(i) != ' ' && getPriority(rpn.charAt(i)) == 0) { operand += rpn.charAt(i++); if (i == rpn.length()) break; } stack.push(Double.parseDouble(operand)); } if(getPriority(rpn.charAt(i)) > 1){ double a = stack.pop(), b = stack.pop(); if (rpn.charAt(i) == '+') stack.push(b+a); if (rpn.charAt(i) == '-') stack.push(b-a); if (rpn.charAt(i) == '*') stack.push(b*a); if (rpn.charAt(i) == '/') stack.push(b/a); } } return stack.pop(); } private int getPriority(char token){ if (token == '*' || token == '/') return 3; else if(token == '+' || token == '-') return 2; else if(token == '(' ) return 1; else if(token == ')' ) return -1; else return 0; } }