Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- import java.lang.String;
- import java.lang.Double;
- import java.util.ArrayList;
- class Stack implements Priority_operations{
- private ArrayList <String> formula_str = new ArrayList<>();
- private StringBuilder formula;
- private int SIZE;
- //private int SIZE_str = 0;
- private ArrayList <Double> digits = new ArrayList<>();
- private ArrayList <String> operations = new ArrayList<>();
- Stack(){ }
- void set_formula(String formula){
- this.formula = new StringBuilder(formula);
- }
- StringBuilder get_formula(){
- return formula;
- }
- void formula_toStringArray(){
- StringBuilder temp = new StringBuilder();
- int mark_start = 0;// Две метки начала и конца числа
- int mark_end = 0;
- if(formula.charAt(0) == '-'){ // если первым минус, то сразу его в число
- mark_end = 1;
- while(mark_end != formula.length() && formula.charAt(mark_end) != '+' && formula.charAt(mark_end) != '-' && formula.charAt(mark_end) != '/' && formula.charAt(mark_end) != '*' && formula.charAt(mark_end) != '(')
- mark_end++;
- for (int i = mark_start; i < mark_end; i++)
- temp.append(formula.charAt(i)); // между началом и концом записывать символы в темп
- formula_str.add(temp.toString());
- mark_start = mark_end + 1;
- temp = new StringBuilder();
- }
- for(int i = mark_end; i < SIZE; i++){
- if(formula.charAt(i) == '+' || formula.charAt(i) == '-' || formula.charAt(i) == '/' || formula.charAt(i) == '*' || formula.charAt(i) == '(' || formula.charAt(i) == ')'){ //если найден знак или скобка
- mark_end = i; // концу присваиваем индекс первого занака
- for (int j = mark_start; j < mark_end; j++)
- temp.append(formula.charAt(j)); // между началом и концом записывать символы в темп
- if(!temp.toString().equals("")) { // если темп не пустой, то заносим темп в массив
- formula_str.add(temp.toString());
- //SIZE_str++;
- }
- formula_str.add(String.valueOf(formula.charAt(mark_end))); // заносим операцию в массив
- //SIZE_str++;
- temp = new StringBuilder(); // обнуляем темп
- mark_start = mark_end + 1; // старт теперь после конца
- }
- }
- mark_end = SIZE; // конец в конце строки
- for (int j = mark_start; j < mark_end; j++) // записываем последнее число в темп
- temp.append(formula.charAt(j));
- if(!temp.toString().equals("")) { //если темп не пустой, то заносим в массив
- formula_str.add(temp.toString());
- //SIZE_str++;
- }
- for (int i = 1; i < formula_str.size() - 1; i++){ //если после скобки отрицательное число
- if(formula_str.get(i - 1).equals("(") && formula_str.get(i).equals("-") && !formula_str.get(i + 1).equals("(")) { //если после скобки '-'
- formula_str.set(i, formula_str.get(i) + formula_str.get(i + 1));
- formula_str.remove(i + 1);
- }
- }
- }
- boolean check_formula(){
- boolean error = false;
- String buffer = formula.toString();
- buffer = buffer.replace(',', '.'); // смена ',' на '.'
- buffer = buffer.replace(" ", ""); //удаление пробелов
- formula = new StringBuilder(buffer);
- if(formula.toString().isEmpty())
- return true;
- SIZE = formula.length();
- if(SIZE > 100) // проверка на длину
- error = true;
- if((formula.charAt(0) > 40 && formula.charAt(0) < 48) && formula.charAt(0) != '-') // первый символ число или '(' или '-'
- error = true;
- if(formula.charAt(SIZE - 1) > 39 && formula.charAt(SIZE - 1) < 48 && formula.charAt(SIZE - 1) != ')') // последний символ число или ')'
- error = true;
- for(int i = 0; i < SIZE - 1; i++){ // проверка на два знака подряд
- if((formula.charAt(i) == '+' || formula.charAt(i) == '-' || formula.charAt(i) == '*' || formula.charAt(i) == '/' || formula.charAt(i) == '.') &&
- (formula.charAt(i + 1) == '+' || formula.charAt(i + 1) == '-' || formula.charAt(i + 1) == '*' || formula.charAt(i + 1) == '/' || formula.charAt(i + 1) == '.'))
- error = true;
- if(formula.charAt(i) == '(' && formula.charAt(i + 1) == ')') //проверка на пустые скобки
- error = true;
- if(formula.charAt(i) == '(' && (formula.charAt(i + 1) == '+' || formula.charAt(i + 1) == '*' || formula.charAt(i + 1) == '/')) // проверка после '(' не знак, кроме '-'
- error = true;
- if((formula.charAt(i) == '-' || formula.charAt(i) == '+' || formula.charAt(i) == '*' || formula.charAt(i) == '/') && formula.charAt(i + 1) == ')') // провекрка перед ')' не знак
- error = true;
- }
- int open = 0;
- int close = 0;
- for(int i = 0; i < SIZE; i++) {
- if (!(formula.charAt(i) > 39 && formula.charAt(i) < 58 && formula.charAt(i) != ' ')) // проверка на допустимые символы
- {
- error = true;
- break;
- }
- if(i != 0 && formula.charAt(i) == '(' && (formula.charAt(i - 1) != '+' && formula.charAt(i - 1) != '-' && formula.charAt(i - 1) != '*' && formula.charAt(i - 1) != '/' && formula.charAt(i - 1) != '(')) // проверка на то, что перед '(' есть знак или '('
- error = true;
- if(i != SIZE - 1 && formula.charAt(i) == ')' && (formula.charAt(i + 1) != '+' && formula.charAt(i + 1) != '-' && formula.charAt(i + 1) != '*' && formula.charAt(i + 1) != '/' && formula.charAt(i + 1) != ')')) // проверка на то, что после ')' есть знак или ')'
- error = true;
- if(formula.charAt(i) == '(') // подсчет скобочек
- open++;
- if(formula.charAt(i) == ')')
- close++;
- if(close > open) { // сначала должна идти открывающаяся скобка
- error = true;
- break;
- }
- }
- if(open != close) // проверка на соответствие скобочек
- error = true;
- return error;
- }
- private int priority(String operation){
- switch (operation){
- case "+":
- return PLUS;
- case "-":
- return MINUS;
- case "*":
- return MULTIPLICATION;
- case "/":
- return DIVISION;
- default:
- return 0;
- }
- }
- private double operate(double first, double second, String operate){
- switch (operate){
- case "+":
- return first + second;
- case "-":
- return first - second;
- case "*":
- return first * second;
- case "/":
- return first / second;
- default:
- return 5;
- }
- }
- double result() {
- String given_element;
- double first;
- double second;
- for(int i = 0; i < formula_str.size(); i++){
- given_element = formula_str.get(i);
- switch (given_element) {
- case "+":
- case "-":
- case "/":
- case "*":
- if (operations.isEmpty()) {
- operations.add(given_element);
- } else {
- while (!operations.isEmpty() && digits.size() > 1 && priority(given_element) <= priority(operations.get(operations.size() - 1))) {
- second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- digits.add(operate(first, second, operations.get(operations.size() - 1)));
- operations.remove(operations.size() - 1);
- }
- operations.add(given_element);
- }
- break;
- case "(":
- operations.add(given_element);
- // if(formula_str.get(i + 1).equals("-"))
- if( i > 0 && formula_str.get(i - 1).equals("-") && formula_str.get(i).equals("(")){
- if(i == 1) {
- digits.add(0.0);
- break;
- }
- if(formula_str.get(i - 2).equals("(")) {
- digits.add(0.0);
- break;
- }
- }
- break;
- case ")":
- while (!operations.get(operations.size() - 1).equals("(") && digits.size() > 1) {
- second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- digits.add(operate(first, second, operations.get(operations.size() - 1)));
- operations.remove(operations.size() - 1);
- }
- operations.remove(operations.size() - 1);
- break;
- default:
- digits.add(Double.parseDouble(given_element));
- break;
- }
- }
- while(!operations.isEmpty() && digits.size() > 1){
- second = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- first = digits.get(digits.size() - 1); // удаляем digits[digits.length - 1]
- digits.remove(digits.size() - 1);
- digits.add(operate(first, second, operations.get(operations.size() - 1)));
- operations.remove(operations.size() - 1);
- }
- double result = digits.get(0);
- formula_str.clear();
- digits.clear();
- operations.clear();
- return result;
- }
- void get_operations(){
- for(int i = 0; i < operations.size(); i++){
- System.out.println(operations.get(i));
- }
- }
- void get_formula_str(){
- for(int i = 0; i < formula_str.size(); i++){
- System.out.println(formula_str.get(i));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement