Advertisement
jovanovski

The A-Team: Математички израз

Oct 30th, 2014
512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.47 KB | None | 0 0
  1. /*Да се напише алгоритам кој ќе пресметува (евалуира) математички израз составен од броеви и операциите за собирање (+) и множење (*).
  2.  
  3. Забелешка: Операцијата множење има предност пред операцијата собирање.*/
  4. import java.io.BufferedReader;
  5. import java.io.IOException;
  6. import java.io.InputStreamReader;
  7. import java.util.NoSuchElementException;
  8.  
  9. interface Stack<E> {
  10.  
  11.     // Elementi na stekot se objekti od proizvolen tip.
  12.  
  13.     // Metodi za pristap:
  14.  
  15.     public boolean isEmpty();
  16.  
  17.     // Vrakja true ako i samo ako stekot e prazen.
  18.  
  19.     public E peek();
  20.  
  21.     // Go vrakja elementot na vrvot od stekot.
  22.  
  23.     // Metodi za transformacija:
  24.  
  25.     public void clear();
  26.  
  27.     // Go prazni stekot.
  28.  
  29.     public void push(E x);
  30.  
  31.     // Go dodava x na vrvot na stekot.
  32.  
  33.     public E pop();
  34.     // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  35. };
  36.  
  37. class ArrayStack<E> implements Stack<E> {
  38.  
  39.     // Stekot e pretstaven na sledniot nacin:
  40.     // depth e dlabochinata na stekot, a
  41.     // elems[0...depth-1] se negovite elementi.
  42.     private E[] elems;
  43.     private int depth;
  44.  
  45.     @SuppressWarnings("unchecked")
  46.     public ArrayStack(int maxDepth) {
  47.         // Konstrukcija na nov, prazen stek.
  48.         elems = (E[]) new Object[maxDepth];
  49.         depth = 0;
  50.     }
  51.  
  52.     public boolean isEmpty() {
  53.         // Vrakja true ako i samo ako stekot e prazen.
  54.         return (depth == 0);
  55.     }
  56.  
  57.     public E peek() {
  58.         // Go vrakja elementot na vrvot od stekot.
  59.         if (depth == 0)
  60.             throw new NoSuchElementException();
  61.         return elems[depth - 1];
  62.     }
  63.  
  64.     public void clear() {
  65.         // Go prazni stekot.
  66.         for (int i = 0; i < depth; i++)
  67.             elems[i] = null;
  68.         depth = 0;
  69.     }
  70.  
  71.     public void push(E x) {
  72.         // Go dodava x na vrvot na stekot.
  73.         elems[depth++] = x;
  74.     }
  75.  
  76.     public E pop() {
  77.         // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  78.         if (depth == 0)
  79.             throw new NoSuchElementException();
  80.         E topmost = elems[--depth];
  81.         elems[depth] = null;
  82.         return topmost;
  83.     }
  84.  
  85.     public String toString() {
  86.         String st = "";
  87.         for (int i = 0; i < depth; i++) {
  88.             st += elems[i] + " ";
  89.         }
  90.         return st;
  91.     }
  92. };
  93.  
  94. public class ExpressionEvaluator {
  95.  
  96.     public static int evaluateExpression(String expression) {
  97.         // Vasiot kod tuka
  98.         ArrayStack<String> stek = new ArrayStack<String>(expression.length());
  99.         boolean mnozenje = false;
  100.         String broj = "";
  101.        
  102.         //Измини ја целиот стринг, карактер по карактер
  103.         for (char c : expression.toCharArray()) {
  104.             //Ако налетаме на знак
  105.             if (c == '+' || c == '*') {
  106.                 //Ако последниот знак бил множење
  107.                 if(mnozenje){
  108.                     mnozenje = false;
  109.                     //Извади го последниот број од стекот, помножи го со сегашниот, и зачувај ги во broj променливата
  110.                     int mnoz = Integer.parseInt(broj) * Integer.parseInt(stek.pop());
  111.                     broj = mnoz + "";
  112.                 }
  113.                 //Ако треба да се множи, запамти
  114.                 if(c=='*'){
  115.                     mnozenje = true;
  116.                 }
  117.                 //Ако до сега сме работеле со број, додади го во стекот и ресетирај ја променливата
  118.                 stek.push(broj);
  119.                 broj = "";
  120.  
  121.             }
  122.             //Ако налетаме на бројка, едноставно конкатанирај стринг
  123.             else {
  124.                 broj += c + "";
  125.             }
  126.         }
  127.         //Направи ја последната проверка, бидејќи ние правиме множење кога ќе налетаме на знак, а последниот
  128.         //карактер секогаш ќе ни е бројка, така да мора да провериме повторно
  129.         if(mnozenje){
  130.             mnozenje = false;
  131.             int mnoz = Integer.parseInt(broj) * Integer.parseInt(stek.pop());
  132.             //Овде го додаваме назад во стекот а не во broj променливата бидејќи е последен
  133.             stek.push(mnoz+"");
  134.         }
  135.         else{
  136.             stek.push(broj);
  137.         }
  138.        
  139.         //Собери ги членовите од стекот
  140.         int sum = 0;
  141.         while(!stek.isEmpty()){
  142.             sum+=Integer.parseInt(stek.pop());
  143.         }
  144.  
  145.         return sum;
  146.     }
  147.  
  148.     public static void main(String[] args) throws IOException {
  149.         BufferedReader input = new BufferedReader(new InputStreamReader(
  150.                 System.in));
  151.         System.out.println(evaluateExpression(input.readLine()));
  152.     }
  153.  
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement