Advertisement
siiena

stackmachine

Feb 20th, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. long max(long a, long b) {
  7.         if (a >= b) return a;
  8.         else return b;
  9. }
  10.  
  11. long min(long a, long b) {
  12.         if (a <= b) return a;
  13.         else return b;
  14. }
  15.  
  16. void swap(long a, long b) {
  17.         long t = 0;
  18.         t = a;
  19.         a = b;
  20.         b = t;
  21. }
  22.  
  23. void f_const(long a, long data[], long *i) {
  24.         data[(*i)] = a;
  25.         (*i)++;
  26. }
  27.  
  28. void f_add(long data[], long *i) {
  29.         (*i)--;
  30.         data[(*i) - 1] = data[(*i)] + data[(*i) - 1];
  31. }
  32.  
  33. void f_sub(long data[], long *i) {
  34.         (*i)--;
  35.         data[(*i) - 1] = data[(*i)] - data[(*i) - 1];
  36. }
  37.  
  38. void f_mul(long data[], long *i) {
  39.         (*i)--;
  40.         data[(*i) - 1] = data[(*i)] * data[(*i) - 1];
  41. }
  42.  
  43. void f_div(long data[], long *i) {
  44.         (*i)--;
  45.         data[(*i) - 1] = data[(*i)] / data[(*i) - 1];
  46. }
  47.  
  48. void f_max(long data[], long *i) {
  49.         (*i)--;
  50.         if (data[(*i)] > data[(*i) - 1]) data[(*i) - 1] = data[(*i)];
  51. }
  52.  
  53. void f_min(long data[], long *i) {
  54.         (*i)--;
  55.         if (data[(*i)] > data[(*i) - 1])
  56.           data[(*i) - 1] = data[(*i) - 1];
  57.         else data[(*i) - 1] = data[(*i)];
  58. }
  59.  
  60. void f_neg(long a, long data[], long *i) {
  61.         (*i)--;
  62.         a = data[(*i)];
  63.         data[(*i)] = -a;
  64.         (*i)++;
  65. }
  66.  
  67. void f_dup(long data[], long *i) {
  68.         data[(*i)] = data[(*i) - 1];
  69.         (*i)++;
  70. }
  71.  
  72. void f_swap(int a, long data[], long *i) {
  73.         (*i)--;
  74.         a = data[(*i) - 1];
  75.         data[(*i) - 1] = data[(*i)];
  76.         data[(*i)] = a;
  77.         (*i)++;
  78. }
  79.  
  80. int main() {
  81.         long n, i = 0;
  82.         scanf("%ld", &n);
  83.         long data[100000] = {0};
  84.         for (long j = 0; j < n; j++) {
  85.                 char str[6], constt[6] = "CONST", add[5] = "ADD", sub[5] = "SUB",
  86.                 mul[5] = "MUL", div[5] = "DIV", max[5] = "MAX", min[5] = "MIN",
  87.                 neg[5] = "NEG", dup[5] = "DUP", swap[5] = "SWAP";
  88.                 long a = 0;
  89.                 scanf("%s", str);
  90.                 if (strcmp(str, constt) == 0) {
  91.                         scanf("%ld", &a);
  92.                         f_const(a, data, &i);
  93.                 }
  94.                 else if ((int)strcmp(str, add) == 0) f_add(data, &i);
  95.                 else if ((int)strcmp(str, sub) == 0) f_sub(data, &i);
  96.                 else if ((int)strcmp(str, mul) == 0) f_mul(data, &i);
  97.                 else if ((int)strcmp(str, div) == 0) f_div(data, &i);
  98.                 else if ((int)strcmp(str, max) == 0) f_max(data, &i);
  99.                 else if ((int)strcmp(str, min) == 0) f_min(data, &i);
  100.                 else if ((int)strcmp(str, neg) == 0) f_neg(a, data, &i);
  101.                 else if ((int)strcmp(str, dup) == 0) f_dup(data, &i);
  102.                 else if ((int)strcmp(str, swap) == 0) f_swap(a, data, &i);
  103.         }
  104.         //for (long i = 0; i < n; i++) {
  105.         //  printf("%ld ", data[i]);
  106.         //}
  107.         printf("%ld ", data[i - 1]);
  108.     return 0;
  109. }
  110.  
  111. ____________________________________________________________________________________________________________________________
  112.  
  113. Стековая машина
  114.  
  115. Пусть стековая машина – это устройство для выполнения арифметических операций, использующее для хранения промежуточных результатов вычислений стек целых чисел. Подразумевается, что каждая операция берёт операнды из стека и оставляет на стеке результат.
  116. Составьте программу stackmachine.c, моделирующую работу стековой машины.
  117.  
  118. Формат входных данных
  119. Первая строка, считываемая со стандартного потока ввода, содержит общее количество выполняемых операций n (0 < n ≤ 100000). Каждая из следующих n строк содержит описание операции.
  120. Стековая машина должна обеспечивать выполнение следующих операций:
  121.  
  122. CONST x – кладёт в стек число x (-1000000000 < x < 1000000000);
  123. ADD – сложение (снимает со стека два операнда a и b и кладёт в стек их сумму);
  124. SUB – вычитание (снимает со стека операнд a, затем снимает со стека операнд b, кладёт в стек a - b);
  125. MUL – умножение (снимает со стека два операнда a и b и кладёт в стек их произведение);
  126. DIV – деление (снимает со стека операнд a, затем снимает со стека операнд b, кладёт в стек результат целочисленного деления a на b);
  127. MAX – максимум двух чисел (снимает со стека два операнда a и b и кладёт в стек max(a,b));
  128. MIN – минимум двух чисел (снимает со стека два операнда a и b и кладёт в стек min(a,b));
  129. NEG – меняет знак числа, находящегося на вершине стека;
  130. DUP – кладёт в стек копию числа, находящегося на вершине стека;
  131. SWAP – меняет местами два числа, находящиеся на вершине стека.
  132. Можно считать, что последовательность операций составлена правильно, то есть перед вызовом каждой операции стек содержит нужное ей количество операндов, деление на ноль и переполнение не возникают, и, кроме того, в результате выполнения всех операций на стеке остаётся единственное число.
  133. Формат результата работы программы
  134. В стандартный поток вывода необходимо вывести число, оставшееся на вершине стека в результате выполнения последовательности операций.
  135. Пример работы программы
  136.  
  137. Ввод:
  138. 6
  139. CONST 10
  140. NEG
  141. CONST 20
  142. SUB
  143. CONST 15
  144. MAX
  145. Вывод:
  146. 30
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement