Advertisement
majczel23000

[Java] Calc with ONP v3 with stack

Mar 26th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.99 KB | None | 0 0
  1. package kalkulatorONP;
  2.  
  3. public class Calc {
  4.    
  5.     public static boolean sprawdz_priorytet(String stos, String args)
  6.     {
  7.         int p1 = 0, p2 = 0;
  8.         switch(stos)
  9.         {
  10.             case "+":
  11.                 p1 = 1;
  12.                 break;
  13.             case "-":
  14.                 p1 = 1;
  15.                 break;
  16.             case "x":
  17.                 p1 = 2;
  18.                 break;
  19.             case"/":
  20.                 p1 = 2;
  21.                 break;
  22.             default:
  23.                 break;
  24.         }
  25.         switch(args)
  26.         {
  27.             case "+":
  28.                 p2 = 1;
  29.                 break;
  30.             case "-":
  31.                 p2 = 1;
  32.                 break;
  33.             case "x":
  34.                 p2 = 2;
  35.                 break;
  36.             case"/":
  37.                 p2 = 2;
  38.                 break;
  39.             default:
  40.                 break;
  41.         }
  42.         return (p1 >= p2);
  43.     }
  44.    
  45.     public static void wypisz(String[] wyjscie)
  46.     {
  47.         //System.out.print("W ONP: ");
  48.         for(int i = 0; i < wyjscie.length; i++)
  49.             if(wyjscie[i] != null)
  50.                 System.out.print(wyjscie[i] + " ");
  51.         System.out.print(" = ");
  52.     }
  53.  
  54.     public static void main(String[] args) {
  55.        
  56.         Stos stosik = new Stos();
  57.        
  58.         //dlugosc dzialania
  59.         int dlugosc = 0;
  60.         while(args[0].charAt(dlugosc) != '=')
  61.             dlugosc++;
  62.        
  63.         //Wypisanie dzialania
  64.         //System.out.print("Działanie: ");
  65.         for(int i = 0; i < dlugosc; i++)
  66.             System.out.print(args[0].charAt(i));
  67.         System.out.print(" = ");
  68.        
  69.         //Tablice wejscia i wyjscia
  70.         String[] wyjscie = new String[dlugosc];
  71.         double[] wejscie = new double[dlugosc];
  72.        
  73.         //przechowywanie indexu gdzie mozna wstawic element w tablic wyjscie
  74.         int tmp_wy = 0;
  75.        
  76.         for(int i = 0; i < dlugosc; )
  77.         {
  78.             //sprawdzanie czy jest liczba
  79.             if(Character.isDigit(args[0].charAt(i)))
  80.             {
  81.                 wyjscie[tmp_wy] = Character.toString(args[0].charAt(i));
  82.                 i++;
  83.                 //szukanie wielocyfrowych oraz liczb typu double
  84.                 while(i<dlugosc && (Character.isDigit(args[0].charAt(i)) || args[0].charAt(i) == '.'))
  85.                 {
  86.                     wyjscie[tmp_wy] += args[0].charAt(i);
  87.                     i++;
  88.                 }
  89.                 tmp_wy++;
  90.             }
  91.             else    //jesli nie jest, to moze byc operatorem lub nawiasem
  92.             {
  93.                 if(args[0].charAt(i) == '(')    //jesli nawias otwierajacy to po prostu na stos
  94.                     stosik.push(Character.toString(args[0].charAt(i)));
  95.                 else if(args[0].charAt(i) == ')')   //jesli zamykajacy to na wyjscie wszystko az do napotkania otwierajacego
  96.                 {
  97.                     while(!stosik.return_value().equals("(")) //dopoki na szczycie stosu nie ma nawiasu otwierajacego
  98.                     {
  99.                         wyjscie[tmp_wy] = stosik.pop();
  100.                         tmp_wy++;
  101.                     }
  102.                     stosik.pop();
  103.                 }
  104.                 else    //sprawdzanie priorytetu
  105.                 {
  106.                     if(stosik.return_size()>0)
  107.                     {
  108.                         if(!stosik.return_value().equals("(") && sprawdz_priorytet(stosik.return_value(), Character.toString(args[0].charAt(i))))
  109.                         {
  110.                             wyjscie[tmp_wy] = stosik.pop();
  111.                             tmp_wy++;
  112.                             stosik.push(Character.toString(args[0].charAt(i)));
  113.                         }
  114.                         else
  115.                             stosik.push(Character.toString(args[0].charAt(i)));
  116.                     }
  117.                     else
  118.                         stosik.push(Character.toString(args[0].charAt(i)));
  119.                 }
  120.                 i++;
  121.             }
  122.             //stosik.drukuj();
  123.         }
  124.        
  125.         while(!stosik.empty())
  126.         {
  127.             wyjscie[tmp_wy] = stosik.pop();
  128.            
  129.             tmp_wy++;
  130.         }
  131.        
  132.         //TERAZ WEJSCIE I OBLICZENIE WARTOSCI WYRAZENIA
  133.         int k = tmp_wy;
  134.         //WYPISANIE WYRAZENIA W ONP
  135.         wypisz(wyjscie);
  136.        
  137.         int tmp_we = 0;
  138.         for(int i = 0; i < k; i++)
  139.         {
  140.             //sprawdzanie czy jest liczba
  141.             if(Character.isDigit(wyjscie[i].charAt(0)))
  142.             {
  143.                 wejscie[tmp_we] = Double.parseDouble(wyjscie[i]);
  144.                 tmp_we++;
  145.             }
  146.             else    //znaczy ze operator, czyli wykonanie dzialania
  147.             {
  148.                 if(wyjscie[i].equals("+"))
  149.                     wejscie[tmp_we - 2] = wejscie[tmp_we - 2] + wejscie[tmp_we - 1];
  150.                 else if(wyjscie[i].equals("-"))
  151.                     wejscie[tmp_we - 2] = wejscie[tmp_we - 2] - wejscie[tmp_we - 1];
  152.                 else if(wyjscie[i].equals("x"))
  153.                     wejscie[tmp_we - 2] = wejscie[tmp_we - 2] * wejscie[tmp_we - 1];
  154.                 else if(wyjscie[i].equals("/"))
  155.                     wejscie[tmp_we - 2] = wejscie[tmp_we - 2] / wejscie[tmp_we - 1];
  156.                 tmp_we--;
  157.             }
  158.         }
  159.         //System.out.println("");
  160.         System.out.print( wejscie[0]);
  161.     }
  162. }
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  176. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  177. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  178. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  180. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  181. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  182. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  183. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184.  
  185.  
  186.  
  187. package kalkulatorONP;
  188.  
  189. public class Stos {
  190.     String[] stos = new String[100];
  191.     int licznik = 0;
  192.    
  193.    
  194.     //ZDEJMOWANIE ELEMENTU ZE STOSU
  195.     public String pop(){
  196.         if(!empty())
  197.         {
  198.             licznik--;
  199.             return stos[licznik];
  200.         }
  201.         else
  202.             System.out.println("Stos pusty");
  203.         return null;
  204.     }
  205.    
  206.     //DODAWANIE ELEMENTU NA STOS
  207.     public void push(String value){
  208.         stos[licznik] = value;
  209.         licznik++;
  210.     }
  211.    
  212.     //ZWRACANIE WARTOŚCI NA STOSIE
  213.     public String return_value()
  214.     {
  215.         return stos[licznik-1];
  216.     }
  217.    
  218.     //WYPISYWANIE STOSU
  219.     public void drukuj(){
  220.         if(empty())
  221.             System.out.println("Stos pusty, nie ma co wypisać");
  222.         else
  223.             for(int i = 0; i < licznik; i++)
  224.                 System.out.print(stos[i] + ", ");
  225.             System.out.println("");
  226.     }
  227.    
  228.     //SPRAWDZANIE CZY STOS JEST PUSTY
  229.     public boolean empty() {
  230.         if(licznik<1)
  231.             return true;
  232.         else
  233.             return false;
  234.     }
  235.    
  236.     //ZWRACANIE ROZMIARU STOSU
  237.     public int return_size() {
  238.         return licznik;
  239.     }
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement