#include #define N 5 #define EMPTY -1 #define FULL -2 int queueIO(int); int main() { int n, r; printf("キューを実現するプログラム\n"); printf(" 正の整数値:入力値をキューに格納する(Enqueue)\n"); printf(" 負の整数値:キューからデータを取り出す(Dequeue)\n"); printf(" 0:終了\n"); while (1) { printf("整数値を入力 (正:格納 (Enqueue),負:取出 (Dequeue),0:終了): "); scanf("%d", &n); if (n == 0) break; /* 終了 */ r = queueIO(n); /* 格納または取出 */ if (r > 0) printf("取出データ = %d\n", r); /* 取得データの表示 */ else if (r == EMPTY) printf("エラー(キューが空です)\n"); else if (r == FULL ) printf("エラー(キューが満杯です)\n"); queueIO(0); /* 表示 戻り値(0)は使用しない */ } return 0; } /* [引数] 正の整数: 格納,負の整数: 取出,0: 表示 [戻り値] 格納の場合) キューが満杯: マクロ定数 FULL,それ以外: 0 取出の場合) キューが空: マクロ定数 EMPTY,それ以外: 取り出した値 表示の場合) 0 */ int queueIO(int x) { static int queue[N]; /* データを格納する配列 */ static int head = 0, tail = 0, size = 0; /* 先頭,末尾,データ数 */ int i, j, data; if (x > 0) { /* 格納 */ if (size == N) return FULL; queue[tail++] = x; if (tail == N) tail = 0; size++; } else if (x < 0){ /* 取出 */ if (size == 0) return EMPTY; data = queue[head++]; if (head == N) head = 0; size--; return data; } else { /* 表示 */ printf("head = %d, tail = %d, size = %d [", head, tail, size); for (i = 0, j = head; i < size; i++) { printf("%d ", queue[j++]); if (j == N) j = 0; } printf("]\n"); } return 0; }