fork download
  1. #include <stdio.h>
  2.  
  3. #define SIZE 5
  4. int queue[SIZE];
  5. int head, tail;
  6.  
  7. void enqueue(int value);
  8. int dequeue(void);
  9.  
  10. int main(void)
  11. {
  12. head = tail = 0;
  13. int resp, data, i;
  14.  
  15. while (1) {
  16. printf("1: enqueue 2: dequeue 0: end : ");
  17. scanf("%d", &resp);
  18.  
  19. if (!resp)
  20. break;
  21.  
  22. switch (resp) {
  23. case 1:
  24. printf("enqueue : ");
  25. scanf("%d", &data);
  26. enqueue(data);
  27. break;
  28. case 2:
  29. dequeue();
  30. break;
  31. default:
  32. printf("不正な入力です。\n");
  33. break;
  34. }
  35.  
  36. printf("head=%d, tail=%d\n", head, tail);
  37. }
  38.  
  39. printf("\n");
  40. i = head;
  41. while (i != tail) {
  42. printf("queue[%d]=%d\n", i, queue[i]);
  43. i = (i + 1) % SIZE;
  44. }
  45.  
  46. return 0;
  47. }
  48.  
  49. void enqueue(int value)
  50. {
  51. if ((tail + 1) % SIZE == head) {
  52. printf("キューが満杯で入りませんでした\n");
  53. } else {
  54. queue[tail] = value;
  55. tail = (tail + 1) % SIZE; // ← これが安全!
  56. }
  57. }
  58.  
  59. int dequeue(void)
  60. {
  61. int value;
  62. if (head == tail) {
  63. printf("キューは空で取り出せませんでした\n");
  64. return 0;
  65. } else {
  66. value = queue[head];
  67. queue[head] = 0; // ← 初期化もしておくと安心
  68. head = (head + 1) % SIZE; // ← これも安全!
  69. return value;
  70. }
  71. }
  72.  
Success #stdin #stdout 0.01s 5316KB
stdin
1 2
2
0
stdout
1: enqueue  2: dequeue  0: end : enqueue : head=0, tail=1
1: enqueue  2: dequeue  0: end : head=1, tail=1
1: enqueue  2: dequeue  0: end :