Advertisement
cd62131

Stack and Queue

May 31st, 2018
768
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. #define N 10
  5. static int S[N], Sp;
  6. static int Q[N], Hp, Tp, Num;
  7.  
  8. static void stack_init(void);
  9. static void stack_push(int v);
  10. static bool stack_empty(void);
  11. static bool stack_filled(void);
  12. static int stack_top(void);
  13. static void stack_pop(void);
  14. static void stack_display(void);
  15. static void queue_init(void);
  16. static void queue_push(int v);
  17. static bool queue_empty(void);
  18. static bool queue_filled(void);
  19. static int queue_front(void);
  20. static void queue_pop(void);
  21. static void queue_display(void);
  22. static void init(void);
  23. static void display(void);
  24. static int continue_or(void);
  25. static void stack_to_queue(void);
  26. static void queue_to_stack(void);
  27. static void move(int dir);
  28.  
  29. int main(void) {
  30.     init();
  31.     display();
  32.     for (int dir = continue_or(); dir; dir = continue_or()) {
  33.         move(dir);
  34.         display();
  35.     }
  36. }
  37.  
  38. static void init(void) {
  39.     stack_init();
  40.     {
  41.         stack_push(45);
  42.         stack_push(16);
  43.         stack_push(58);
  44.         //stack_push(1);
  45.         //stack_push(2);
  46.         //stack_push(3);
  47.         //stack_push(4);
  48.     }
  49.     queue_init();
  50.     {
  51.         queue_push(0); // dummy
  52.         queue_push(0); // dummy
  53.         queue_push(35);
  54.         queue_push(94);
  55.         queue_push(67);
  56.         queue_push(40);
  57.         queue_pop();
  58.         queue_pop();
  59.     }
  60. }
  61.  
  62. static void display(void) {
  63.     stack_display();
  64.     queue_display();
  65. }
  66.  
  67. static int continue_or(void) {
  68.     int v;
  69.     printf("? ");
  70.     fflush(stdout);
  71.     scanf("%d", &v);
  72.     return v;
  73. }
  74.  
  75. static void move(int dir) {
  76.     if (dir >= 0) {
  77.         stack_to_queue();
  78.         return;
  79.     }
  80.     queue_to_stack();
  81. }
  82.  
  83. static void stack_to_queue(void) {
  84.     if (stack_empty()) {
  85.         return;
  86.     }
  87.     int v = stack_top();
  88.     stack_pop();
  89.     if (queue_filled()) {
  90.         stack_push(v);
  91.         return;
  92.     }
  93.     queue_push(v);
  94. }
  95.  
  96. static void queue_to_stack(void) {
  97.     if (queue_empty()) {
  98.         return;
  99.     }
  100.     int v = queue_front();
  101.     queue_pop();
  102.     if (stack_filled()) {
  103.         queue_push(v);
  104.         return;
  105.     }
  106.     stack_push(v);
  107. }
  108.  
  109. static void stack_init(void) {
  110.     for (size_t i = 0; i < N; i++) {
  111.         S[i] = -1;
  112.     }
  113.     Sp = -1;
  114. }
  115.  
  116. static void stack_push(int v) {
  117.     S[++Sp] = v;
  118. }
  119.  
  120. static bool stack_empty(void) {
  121.     return Sp < 0;
  122. }
  123.  
  124. static bool stack_filled(void) {
  125.     return Sp >= N - 1;
  126. }
  127.  
  128. static int stack_top(void) {
  129.     return S[Sp];
  130. }
  131.  
  132. static void stack_pop(void) {
  133.     S[Sp--] = -1;
  134. }
  135.  
  136. static void stack_display(void) {
  137.     printf("S: ");
  138.     for (size_t i = 0; i < N; i++) {
  139.         if (i > 0) {
  140.             printf(", ");
  141.         }
  142.         printf("[%zd]%d", i, S[i]);
  143.     }
  144.     printf("\nSp = %d\n", Sp);
  145. }
  146.  
  147. static void queue_init(void) {
  148.     for (size_t i = 0; i < N; i++) {
  149.         Q[i] = -1;
  150.     }
  151.     Hp = Num = 0;
  152.     Tp = -1;
  153. }
  154.  
  155. static void queue_push(int v) {
  156.     Q[++Tp] = v;
  157.     Tp %= N;
  158.     Num++;
  159. }
  160.  
  161. static bool queue_empty(void) {
  162.     return Num == 0;
  163. }
  164.  
  165. static bool queue_filled(void) {
  166.     return Num >= N;
  167. }
  168.  
  169. static int queue_front(void) {
  170.     return Q[Hp];
  171. }
  172.  
  173. static void queue_pop(void) {
  174.     Q[Hp++] = -1;
  175.     Hp %= N;
  176.     Num--;
  177.     if (!Num) {
  178.         Hp = 0;
  179.         Tp = -1;
  180.     }
  181. }
  182.  
  183. static void queue_display(void) {
  184.     printf("Q: ");
  185.     for (size_t i = 0; i < N; i++) {
  186.         if (i > 0) {
  187.             printf(", ");
  188.         }
  189.         printf("[%zd]%d", i, Q[i]);
  190.     }
  191.     printf("\nHp = %d, Tp = %d, Num = %d\n", Hp, Tp, Num);
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement