#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int max;
int num;
int front;
int rear;
int *que;
} IntQueue;
int Initialize(IntQueue *q, int max)
{
q->num = 0, q->front = max / 2, q->rear = max / 2 + 1;
if ((q->que = (int *)calloc(max, sizeof(int))) == NULL)
{
q->max = 0;
return -1;
}
q->max = max;
return 0;
}
int EnQueue_L(IntQueue *q, int x)
{
if (q->front < 0)
{
return -1;
}
else
{
q->que[q->front--] = x;
q->num++;
return 0;
}
}
int EnQueue_R(IntQueue *q, int x)
{
if (q->rear < q->max / 2 + 1)
{
return -1;
}
else
{
q->que[q->rear++] = x;
q->num++;
return 0;
}
}
int DeQueue_L(IntQueue *q, int *x)
{
if (q->front >= q->max / 2)
{
return -1;
}
else
{
*x = q->que[++q->front];
q->num--;
return 0;
}
}
int DeQueue_R(IntQueue *q, int *x)
{
if (q->rear <= q->max / 2 + 1)
{
return -1;
}
else
{
*x = q->que[--q->rear];
q->num--;
return 0;
}
}
int Capacity(const IntQueue *q)
{
return q->max;
}
int Size(const IntQueue *q)
{
return q->num;
}
void Print(const IntQueue *q)
{
for (int i = 0; i < q->num; i++)
{
printf("%d ", q->que[i + q->front + 1]);
}
printf("\n");
}
int main(void)
{
IntQueue que;
if (Initialize(&que, 64) == -1)
{
puts("큐의 생성에 실패하였습니다.");
return 1;
}
while (1)
{
int m, x, y;
printf("현재 데이터 수 : %d / %d \n", Size(&que), Capacity(&que));
printf("(1)인큐L (2)인큐R (3)디큐L (4)디큐R (5)출력 (0)종료 : ");
scanf("%d", &m);
if (m == 0)
break;
switch (m)
{
case 1:
printf("데이터 : ");
scanf("%d", &x);
if (EnQueue_L(&que, x) == -1)
puts("\a오류 : 인큐에 실패하였습니다.");
break;
case 2:
printf("데이터 : ");
scanf("%d", &x);
if (EnQueue_R(&que, x) == -1)
puts("\a오류 : 인큐에 실패하였습니다.");
break;
case 3:
if (DeQueue_L(&que, &x) == -1)
puts("\a오류 : 디큐에 실패하였습니다.");
else
{
printf("디큐한 데이터는 %d입니다.\n", x);
}
break;
case 4:
if (DeQueue_R(&que, &x) == -1)
puts("\a오류 : 디큐에 실패하였습니다.");
else
{
printf("디큐한 데이터는 %d입니다.\n", x);
}
break;
case 5:
if (que.num <= 0)
{
printf("FAIL\n");
}
else
{
Print(&que);
break;
}
}
}
}