사이즈5인 큐에 1->2->3->4순으로 삽입후
5번째 요소를 넣을 때 정상적으로 삽입됨을 확인하고 모든 원소 삭제를 삭제 후 현재 front와 rear변수 위치 확인하기
핵심
1.원형큐는 최초의 한칸 (0번째 배열인덱스자리)을 비워둔다.
최초의 front ,rear 위치
선형큐: front==rear==-1
배열큐: front==rear==0
3. 사소한 실수 조심하기
선형큐 때는 연산 시 return 문을 한줄로 표현할 수 있었는데
원형큐에서 삽입/삭제 연산 시 아래와 같이 작성하면 어떻게될까요?
q->Queue[(q->rear + 1) % MAX_SIZE]=data;
=> rear는 증가하지않고 1번 째 자리에 원소를 대입합니다.
결국에는 이러한 연산을 100번해도 1번째 자리에 원소를 100번 연산하는 꼴이됩니다.
그렇기 때문에 2줄로 나눠서 코드를 작성해야합니다.
q->rear=q->(rear+1)%MAX_SIZE;
q->Queue[q->rear]=data;
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> /*사이즈5인 큐에 1->2->3->4순으로 삽입후 5번째 요소를 넣을 때 정상적으로 삽입됨을 확인하고 모든 원소 삭제를 삭제 후 현재 front와 rear변수 위치 확인하기*/ #define MAX_SIZE 5 typedef struct { int Queue[MAX_SIZE]; int front, rear; }QType; void init(QType* q) { q->front = q->rear = 0; } int is_full(QType* q) { return ((q->rear + 1) % MAX_SIZE == q->front); } void enQueue(QType* q, int data) { if (is_full(q)) { fprintf(stderr, "꽉 차서 원소를 삽입할 수 없어요..\n"); return; } q->rear = (q->rear + 1) % MAX_SIZE; q->Queue[q->rear]=data; } int is_empty(QType* q) { return q->front == q->rear; } int deQueue(QType* q) { if (is_empty(q)) { fprintf(stderr, "큐가 비어서 삭제할 수 없습니다..\n"); exit(1); } q->front = (q->front + 1) % MAX_SIZE; return q->Queue[q->front]; } int main() { QType q; int data; init(&q); //5개 요소를 꽉차지않을 때 까지(5개)삽입하기 int i = 1; while (!is_full(&q)) { printf("%d번째 원소를 삽입합니다.\n", i++); scanf("%d", &data); enQueue(&q, data); } //5번째 원소삽입-> 오류 enQueue(&q, data);//-> 오류메시지출력 while (!is_empty(&q)) printf("%d을 삭제합니다.\n", deQueue(&q)); printf("현재 front와 rear의 위치는(인덱스 자리는) 각각 %d %d입니다.\n", q.front, q.rear); return 0; } | cs |
결과
'자료구조 > 큐' 카테고리의 다른 글
선형 큐(배열 큐) 구현하기 (0) | 2020.04.16 |
---|