Advertisement
UniQuet0p1

DoubleStack

Oct 19th, 2021
869
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.13 KB | None | 0 0
  1. import java.util.LinkedList;
  2. //https://www.javatpoint.com/java-string-isempty
  3. //https://home.cs.colorado.edu/~main/docs/edu/colorado/collections/DoubleStack.html
  4. //http://www.mathcs.emory.edu/~cheung/Courses/171/Projects/hw4/hw4.html
  5. //https://www.javatpoint.com/understanding-toString()-method
  6.  
  7. public class DoubleStack {
  8.  
  9.  
  10.    public static void main (String[] argum) {
  11.    }
  12.  
  13.    private final LinkedList<Double> doubleStack = new LinkedList<>();
  14.  
  15.    DoubleStack() {
  16.    }
  17.    @Override
  18.    public Object clone() throws CloneNotSupportedException {
  19.       DoubleStack doubleS = new DoubleStack();
  20.       for (int i = 0; i <doubleStack.size(); i++) {
  21.          doubleS.doubleStack.addLast(doubleStack.get(i));
  22.       }
  23.       return doubleS;
  24.    }
  25.  
  26.    public boolean stEmpty() {
  27.       return doubleStack.size() <= 0;
  28.    }
  29.  
  30.    public void push (double a) {
  31.       doubleStack.addFirst(a);
  32.    }
  33.  
  34.    public double pop() {
  35.       if (stEmpty()) {
  36.          throw new RuntimeException("No elements");
  37.       }
  38.       return doubleStack.pop();
  39.    }
  40.  
  41.    public void op (String s) throws RuntimeException {
  42.       try {
  43.          double LE = doubleStack.pop();
  44.          double LIFO = doubleStack.pop();
  45.  
  46.          if ("+".equals(s)) {
  47.             doubleStack.push(LIFO + LE);
  48.          } else if ("-".equals(s)) {
  49.             doubleStack.push(LIFO - LE);
  50.          } else if ("*".equals(s)) {
  51.             doubleStack.push(LIFO * LE);
  52.          } else if ("/".equals(s)) {
  53.             doubleStack.push(LIFO / LE);
  54.          } else {
  55.             System.out.printf("'%s' can not be operator, '+', '-', '*' or '/' just can be", s);
  56.          }
  57.       } catch (RuntimeException e) {
  58.          throw new RuntimeException(String.format("Can not do operation %s", s));
  59.       }
  60.    }
  61.  
  62.    public double tos() {
  63.       if (stEmpty()) {
  64.          throw new RuntimeException("Empty");
  65.       }
  66.       return doubleStack.getFirst();
  67.    }
  68.  
  69.  
  70.    @Override
  71.    public boolean equals (Object o) { //Возвращаем false, если размеры стека разные
  72.       if (((DoubleStack) o).doubleStack.size() != doubleStack.size()) {
  73.          return false;
  74.       }
  75.  
  76.       for (int i = 0; i < doubleStack.size(); i++) { //Начинаем сравнивать оба DoubleStack один за другим. Вернуть false, если обнаружено несоответствие
  77.          if (!((DoubleStack) o).doubleStack.get(i).equals(doubleStack.get(i))) {
  78.             return false;
  79.          }
  80.       }
  81.       return true; //Возвращаем истину, если несоответствия не обнаружено
  82.    }
  83.  
  84.    @Override
  85.    public String toString() {
  86.       StringBuilder str = new StringBuilder();
  87.       for (int i = doubleStack.size() - 1; i >= 0; i--)
  88.          str.append(doubleStack.get(i)).append(" ");
  89.       return str.toString();
  90.    }
  91.  
  92.    public static double interpret (String pol) { //Удаляем все ненужное форматирование
  93.       String empty = pol.replaceAll("\t", "").replaceAll("\n", "").replaceAll("[ ](?=[ ])","").trim();
  94.       String[] polArray = empty.split(" ");// Разделить строку на массив, используя пробелы между ними в качестве разделителей
  95.       if (empty.isEmpty()) {
  96.          throw new RuntimeException(String.format("No Elements in  %s", pol));
  97.       }
  98.  
  99.  
  100.       DoubleStack resultStack = new DoubleStack();
  101.       for (String s : polArray) {
  102.          if (s.matches("[+*/\\-]")) {
  103.             resultStack.op(s);
  104.          } else {
  105.             resultStack.push(Double.parseDouble(s)); //Используем стек для вычислений
  106.          }
  107.       }
  108.  
  109.       if (resultStack.doubleStack.size() == 1) {
  110.          return resultStack.pop();
  111.       } else {
  112.          throw new RuntimeException(String.format("Not possible to complate  %s", pol));// Возврат, только если размер стека равен 1,
  113.          // Если не 1, значит, вычисления не завершены, числа остались и выдается исключение
  114.       }
  115.    }
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement