loulett

HW3_poland_notation

Dec 18th, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. int ch(char a)
  6. {
  7.     if (a == '^')
  8.         return 4;
  9.     if (a == '*' || a == '/')
  10.         return 3;
  11.     if (a == '+' || a == '-')
  12.         return 2;
  13.     if (a == '(' || a == ')')
  14.         return 1;
  15.     return 0;
  16. }
  17.  
  18. int nin(char a, char* b)
  19. {
  20.     for (int i = 0; i < 7; i++)
  21.     {
  22.         if (a == b[i])
  23.             return 0;
  24.     }
  25.     return 1;
  26. }
  27.  
  28. int sr(char a, char b)
  29. {
  30.     a = ch(a);
  31.     b = ch(b);
  32.     return a >= b;
  33. }
  34.  
  35. int pr(char a, char b, char c)
  36. {
  37.     if (c == '+')
  38.         return (a + b);
  39.     if (c == '-')
  40.         return (a - b);
  41.     if (c == '*')
  42.         return (a * b);
  43.     if (c == '/')
  44.         return (a / b);
  45.     return pow(a, b);
  46. }
  47.  
  48. int main()
  49. {
  50.     int n = 0, t = -1, k = -1;
  51.     char* q = "()+-*/^";
  52.     scanf("%d", &n);
  53.     char* arr = (char*)malloc(n);
  54.     char* stack = (char*)malloc(n);
  55.     char* ans = (char*)malloc(n);
  56.     scanf("%s", arr);
  57.     for (int i = 0; i < n; i++)
  58.     {
  59.         if (nin(arr[i], q))
  60.         {
  61.             printf("%c ", arr[i]);
  62.             k++;
  63.             ans[k] = arr[i];
  64.         }
  65.         else if (t == -1)
  66.         {
  67.             t++;
  68.             stack[t] = arr[i];
  69.         }
  70.         else
  71.         {
  72.             while (arr[i] != '(' && sr(stack[t], arr[i]) && t > 0)
  73.             {
  74.                 if (stack[t] != '(')
  75.                 {
  76.                     k++;
  77.                     ans[k] = stack[t];
  78.                     printf("%c ", stack[t]);
  79.                     t--;
  80.                 }
  81.                 else
  82.                 {
  83.                     t--;
  84.                     break;
  85.                 }
  86.             }
  87.             if (arr[i] != ')')
  88.             {
  89.                 t++;
  90.                 stack[t] = arr[i];
  91.             }
  92.         }
  93.     }
  94.     while (t != -1)
  95.     {
  96.         if (stack[t] != '(')
  97.         {
  98.             k++;
  99.             ans[k] = stack[t];
  100.             printf("%c ", stack[t]);
  101.             t--;
  102.         }
  103.     }
  104.     for (int i = 0; i <= k; i++)
  105.     {
  106.         if (nin(ans[i], q))
  107.         {
  108.             t++;
  109.             stack[t] = ans[i] - 48;
  110.         }
  111.         else
  112.         {
  113.             t--;
  114.             stack[t] = pr(stack[t], stack[t + 1], ans[i]);
  115.         }
  116.     }
  117.     printf("\n%d\n", stack[t]);
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment