Ladies_Man

3_4 Очередь с операцией Max Max-Seqence

Dec 17th, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define max(x,y) ((x)>(y) ? (x):(y))
  6.  
  7. int *array, n;
  8.  
  9. char emp[6] = "EMPTY";
  10. char enq[4] = "ENQ";
  11. char deq[4] = "DEQ";
  12. char qmax[4] = "MAX";
  13.  
  14. struct queue {
  15.     int *data;
  16.     int h;
  17.     int q;
  18.     int c;
  19.     int t;
  20.     int mc;
  21.     int *locmax;
  22. };
  23.  
  24. void InitQueue (struct queue *s)
  25. {
  26.     s->c = n;
  27.     s->q = 0;
  28.     s->h = n;
  29.     s->t = 0;
  30.     s->mc = 0;
  31. }
  32.  
  33. void QueueEmpty(struct queue *s)
  34. {
  35.     if (0 != s->t) printf("false\n");
  36.     else printf("true\n");
  37. }
  38.  
  39. void EnQueue (struct queue *s, int value)
  40. {
  41.     int tmp = s->q++;
  42.     s->data[tmp] = value;
  43.     s->t = s->t + 1;
  44.     if (0 == tmp || s->locmax[tmp - 1] <= value) s->locmax[tmp] = value;
  45.     else s->locmax[tmp] = s->locmax[tmp - 1];
  46. }
  47.  
  48. void DeQueue (struct queue *s)
  49. {
  50.     struct queue turn;
  51.     int maxel;
  52.     //q = k1; h = k2; c = n
  53.     //s->q--;
  54.     if (0 == s->t) {
  55.         printf("devastation\n");
  56.         return;
  57.     }
  58.     else {
  59.         //max_search(&turn, q, n);
  60.         if (0 != s->t && s->c == s->h) {
  61.             int q = s->q;
  62.             int c = s->c;
  63.             int i = 0;
  64.  
  65.             for (i = q - 1; i >= 0; i--) {
  66.                 int j = c - q + i;
  67.                 maxel = s->data[i];
  68.                 s->data[j] = maxel;
  69.                 if (i ==
  70.                     s->q - 1
  71.                     || s->locmax[j + 1] <= maxel)
  72.                     s->locmax[j] = maxel;
  73.                 else if (i != s->q - 1 || s->locmax[j + 1] >= maxel)
  74.                     s->locmax[j] = s->locmax[j + 1];
  75.                     else  s->q = 0;
  76.             }
  77.             s->q = 0;
  78.             s->h = c - q;
  79.         }
  80.     }
  81.     s->mc--;
  82.     printf("%d\n", s->data[s->h]);
  83.     s->h++;
  84.     s->t--;
  85. }
  86.  
  87. void MaxQueue (struct queue *s)
  88. {
  89.     int ret_val;
  90.     if (0 != s->t && s->h == s->c)
  91.         printf("%d\n", s->locmax[s->q - 1]);
  92.     else {
  93.         if (0 != s->t && 0 == s->q)
  94.             printf("%d\n", s->locmax[s->h]);
  95.         else {
  96.             if (s->locmax[s->q - 1] > s->locmax[s->h])
  97.                 printf("%d\n", s->locmax[s->q - 1]);
  98.             else printf("%d\n", s->locmax[s->h]);
  99.         }
  100.     }
  101.     //printf ("%d\n", max(s->locmax[s->q - 1], s->locmax[s->h]));
  102. }
  103.  
  104. int main()
  105. {
  106.     int enq_val, i;
  107.     char str[6];
  108.  
  109.     scanf ("%d", &n);
  110.  
  111.     struct queue turn;
  112.     turn.data = malloc(n * sizeof(int));
  113.     turn.locmax = malloc(n * sizeof(int));
  114.  
  115.     InitQueue (&turn);
  116.  
  117.     for (i = 0; i < n; i++) {
  118.         scanf ("%s", str);
  119.         if (0 == strcmp(str, emp)) QueueEmpty(&turn);
  120.         else {
  121.             if (0 == strcmp(str, enq)) {
  122.                 scanf ("%d", &enq_val);
  123.                 EnQueue (&turn, enq_val);
  124.             }
  125.             else
  126.                 if (0 == strcmp(str, deq)) DeQueue (&turn);
  127.                 else MaxQueue (&turn);
  128.         }
  129.     }
  130.  
  131.     free(turn.data);
  132.     free(turn.locmax);
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment