아래의 그림에서 배열을 사용한 큐의 예를 보여준다. 그림에서 F와 R은 각각 큐의 front와 rear를 나타낸다. 큐의 초기화 과정에서 front와 rear는 -1로 설정.
#include <stdio.h>
#define ON 1
#define OFF 0
#define QUEUE_SIZE 20
void main() {
int data, temp, sw, q[QUEUE_SIZE];
int front= -1, rear= -1;
int dequeue();
char opcode, inp_string[5];
void enqueue();
sw=ON;
while(sw) {
printf("\n Insert Opcode(E:Enqueue, D:Dequeue, P:Print, Q:Quit): ");
scanf("%s", inp_string);
opcode=inp_string[0]; //opcode를 얻는다.
printf("** opcode = %c \n", opcode);
switch(opcode) {
case 'E':
printf("\n Enter a number to insert: ");
scanf("%d", &data);
printf("Inserted Data=%d \n", data);
enqueue(q, data, &rear);
break;
case 'D':
data = dequeue(q, &front, &rear);
printf("dequeue data is %3d \n", data);
break;
case 'P': //front값을 저장, front값을 직접 사용하면 문제발생
temp=front+1;
while(temp <= rear)
printf("%3d \n", q[temp++]);
break;
case 'Q':
sw=OFF;
break;
default:
printf("\n *** Warning: 부적절한 op_code입니다. \n");
break;
}
}
}
void enqueue(int q[], int data, int *rear) {
if(*rear == QUEUE_SIZE-1)
printf("Queue is full\n");
(*rear)++;
q[*rear]= data;
}
int dequeue(int q[], int *front, int *rear) {
int data;
if(*front == *rear)
printf("queue is empty\n");
(*front)++;
data= q[*front];
if(*front == *rear) {
*front = -1; //앞으로 이동하여 초기화
*rear= -1;
}
return(data);
}
void enqueue(int q[], int data, int *rear, int *front) {
int i, j;
if(*rear == QUEUE_SIZE-1)
if(*front == -1)
printf("queue is full\n");
else { //수평이동
for(i=(*front)+1, j=0; i<QUEUE_SIZE; i++, j++)
q[j]=q[i];
*rear = *rear-((*front)+1);
*front=-1;
}
(*rear)++;
q[*rear]= data;
}
댓글을 달아 주세요
이거 퍼갈게요 return만추가