Advertisement
chlebq

Untitled

Apr 5th, 2020
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. typedef struct stack {
  6.     int* elements;
  7.     int top;
  8.     int max_size;
  9. } stack;
  10.  
  11. void push(stack* s, int n)
  12. {
  13.     s -> top++;
  14.     s -> elements[s->top] = n;
  15. }
  16.  
  17. int pop(stack* s)
  18. {
  19.     s -> top--;
  20.     return s -> elements[s->top+1];
  21. }
  22.  
  23. bool is_empty(stack* s)
  24. {
  25.     if(s -> top == -1)
  26.         return true;
  27.     else return false;
  28. }
  29.  
  30. stack* new_stack(int size)
  31. {
  32.     stack* stos = malloc(sizeof(int*)+2*sizeof(int));
  33.     stos -> max_size = size;
  34.     stos -> elements = malloc(size*sizeof(int));
  35.     stos -> top = -1;
  36.     return stos;
  37. }
  38.  
  39. void delete_stack(stack* s)
  40. {
  41.     free(s -> elements);
  42.     free(s);
  43. }
  44.  
  45. typedef enum entry_type {number, add, subtract, multiply, divide} entry_type;
  46.  
  47. entry_type parse(char* raw)
  48. {
  49.     if (raw[0] == '+') return add;
  50.     if (raw[0] == '-') return subtract;
  51.     if (raw[0] == '*') return multiply;
  52.     if (raw[0] == '/') return divide;
  53.     return number;
  54. }
  55.  
  56. int ConvToInt(char* entry, int max_entry_size)
  57. {
  58.     int t;
  59.     int result = 0;
  60.     int mnoznik = 1;
  61.     for(t = 0; t < max_entry_size && entry[t] != '\0'; t++) mnoznik *= 10;
  62.  
  63.     mnoznik /= 10;
  64.     for(t = 0; t < max_entry_size && entry[t] != '\0'; t++)
  65.     {
  66.         result += (entry[t] - 48)*mnoznik;
  67.         mnoznik /= 10;
  68.     }
  69.     return result;
  70. }
  71.  
  72. void do_add(stack* s)
  73. {
  74.     int a = pop(s);
  75.     int b = pop(s);
  76.     push(s, b+a);
  77. }
  78.  
  79. void do_subtract(stack* s)
  80. {
  81.     int a = pop(s);
  82.     int b = pop(s);
  83.     push(s, b-a);
  84. }
  85.  
  86. void do_multiply(stack* s)
  87. {
  88.     int a = pop(s);
  89.     int b = pop(s);
  90.     push(s, b*a);
  91. }
  92.  
  93. void do_divide(stack* s)
  94. {
  95.     int a = pop(s);
  96.     int b = pop(s);
  97.     push(s, b/a);
  98. }
  99.  
  100. int read_and_calculate(int operands_count, int max_entry_size)
  101. {
  102.     stack* operands = new_stack(operands_count);
  103.     char* entry = malloc((max_entry_size+1)*sizeof(char));
  104.  
  105.     while(operands_count > 0 || operands -> top > 0)
  106.     {
  107.         for(int i=0; i<max_entry_size; i++) entry[i] = '\0';
  108.         scanf("%s", entry);  // tutaj scanuje
  109.  
  110.         if(parse(entry) == add) do_add(operands);
  111.         else if(parse(entry) == subtract) do_subtract(operands);
  112.         else if(parse(entry) == multiply) do_multiply(operands);
  113.         else if(parse(entry) == divide) do_divide(operands);
  114.         else
  115.         {
  116.             push(operands, ConvToInt(entry, max_entry_size));
  117.             operands_count --;
  118.         }
  119.     }
  120.     int result = pop(operands);
  121.     delete_stack(operands);
  122.     free(entry);
  123.     return result;
  124. }
  125.  
  126. int main()
  127. {
  128.     int operands_count, max_entry_size;
  129.     scanf("%d", &operands_count);
  130.     scanf("%d", &max_entry_size);
  131.     printf("%d\n", read_and_calculate(operands_count, max_entry_size));
  132.  
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement