Advertisement
Guest User

fuxaaa

a guest
Feb 25th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <limits.h>
  4.  
  5. #include <string.h>
  6.  
  7. using namespace std;
  8.  
  9. #define MAX_PAMAT 40
  10.  
  11. enum stav_zasobnika {
  12.         OK = -1, FULL = INT_MAX, EMPTY = INT_MIN
  13. };
  14.  
  15. typedef struct {
  16.         int citatel, menovatel;
  17. }Zlomok;
  18.  
  19. typedef struct {
  20.         Zlomok pamat[MAX_PAMAT];
  21.         int vrchol;
  22. }LIFO;
  23.  
  24.  
  25. stav_zasobnika isFull(LIFO & zasobnik) {
  26.         if (zasobnik.vrchol == 0) {
  27.                 return FULL;
  28.         }
  29.         return OK;
  30. }
  31.  
  32. Zlomok pop(LIFO & zasobnik, Zlomok x) {
  33.         if (zasobnik.vrchol > 0) {
  34.                 return zasobnik.pamat[--zasobnik.vrchol];
  35.         } else {
  36.               return zasobnik.pamat[0];
  37.         }
  38.  
  39. }
  40.  
  41. stav_zasobnika push(LIFO & zasobnik, Zlomok x) {
  42.  
  43.         if (zasobnik.vrchol < MAX_PAMAT)
  44.  
  45.                 zasobnik.pamat[zasobnik.vrchol++] = x;
  46.  
  47.         else
  48.  
  49.                 return FULL;
  50.  
  51.         return OK;
  52.  
  53. }
  54. Zlomok add(Zlomok a, Zlomok b) {
  55.         Zlomok c;
  56.         a.menovatel *= b.menovatel;
  57.         b.menovatel *= b.menovatel;
  58.         a.citatel *= b.menovatel;
  59.         b.citatel *= a.menovatel;
  60.  
  61.         c.citatel = a.citatel + b.citatel;
  62.         c.menovatel = a.menovatel;
  63.         return c;
  64. }
  65. Zlomok substaction(Zlomok a, Zlomok b) {
  66.         Zlomok c;
  67.         a.menovatel *= b.menovatel;
  68.         b.menovatel *= b.menovatel;
  69.         a.citatel *= b.menovatel;
  70.         b.citatel *= a.menovatel;
  71.  
  72.         c.citatel = a.citatel - b.citatel;
  73.         c.menovatel = a.menovatel;
  74.         return c;
  75. }
  76. Zlomok vynas(Zlomok a, Zlomok b) {
  77.         Zlomok c;
  78.         c.menovatel = a.menovatel * b.menovatel;
  79.         c.citatel = a.citatel * b.citatel;
  80. }
  81. Zlomok div(Zlomok a, Zlomok b) {
  82.         Zlomok c;
  83.         c.menovatel = b.citatel * a.menovatel;
  84.         c.citatel = b.menovatel * a.citatel;
  85. }
  86. int main() {
  87.         LIFO f;
  88.         f.vrchol = 0;
  89.         Zlomok x;
  90.         int i, j, N;
  91.         Zlomok a, b;
  92.         char vyraz[40], buffer[20];
  93.         cin.getline(vyraz, 39);
  94.         N = (int) strlen(vyraz);
  95.  
  96.         for (i = 0; i < N; i++) {
  97.                 if (vyraz[i] == ' ') {
  98.                         continue;
  99.                 }
  100.                 if (vyraz[i] == '+') {
  101.                         a = pop(f);
  102.                         b = pop(f);
  103.  
  104.                      return push(f, add(a, b));
  105.  
  106.                         continue;
  107.                 }
  108.                 if (vyraz[i] == '*') {
  109.                         a = pop(f);
  110.                         b = pop(f);
  111.                         return push(f, vynas(a, b));
  112.                         continue;
  113.                 }
  114.                 if (vyraz[i] == '/') {
  115.                         a = pop(f);
  116.                         b = pop(f);
  117.                         return push(f, div(a, b));
  118.                         continue;
  119.                 }
  120.                 if (vyraz[i] == '-') {
  121.                         a = pop(f);
  122.                         b = pop(f);
  123.                         return push(f, substaction(a, b));
  124.                         continue;
  125.                 }
  126.                     j = 0;
  127.                     x.citatel = 0;
  128.                     x.menovatel = 1;
  129.  
  130.                 while ((vyraz[i] >= '0' && vyraz[i] <= '9')) {
  131.                         buffer[j] = vyraz[i];
  132.                         i++;
  133.                         j++;
  134.                 }
  135.                     buffer[j] = 0;
  136.                     x.citatel = atoi(buffer);
  137.  
  138.                 if (vyraz[i] == '|') {
  139.                         i++;
  140.                         j = 0;
  141.  
  142.                         while ((vyraz[i] >= '0' && vyraz[i] <= '9')) {
  143.                         buffer[j] = vyraz[i];
  144.                         i++;
  145.                         j++;
  146.                 }
  147.                         x.menovatel = atoi(buffer);
  148.  
  149.                 }
  150.  
  151.                 if (FULL == push(f, x)) {
  152.                         cout << "LIFO overflow";
  153.                         break;
  154.                 }
  155.         }
  156.         cout << pop(f);
  157.         return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement