[문제1] 배열로 만들어진 원형큐에서 삽입, 삭제하는 프로그램
- front, rear, 배열의 초기값은 0
- front == rear이면 공백상태, front + 1 == rear이면 포화상태
- overflow의 경우 배열에 있는 모든값들을 출력 후 프로그램종료 / underflow의 경우 프로그램종료
- I value : 원형큐에 value를 삽입
- D : 원형큐에 원소삭제, 값0으로 바꿈
- P : 배열에 있는 모든 값을 출력
입력예시 출력예시
6 10 I 10 I 20 P I 30 I 40 D P I 50 I 60 I 70 |
0 10 20 0 0 0 0 0 20 30 40 0 overflow 60 0 20 30 40 50 |
#include<stdio.h> #include<stdlib.h> int *queue, queueSize, rear, front; void printQueue(){ for (int i = 0; i < queueSize; i++){ printf(" %d", queue[i]); } printf("\n"); } void enqueue(int value){ if ((rear + 1) % queueSize == front % queueSize){ printf("overflow"); printQueue(queue, queueSize); free(queue); exit(1); } rear = (++(rear)) % queueSize; queue[rear] = value; } int dequeue(){ int value; if (rear % queueSize == front % queueSize){ printf("underflow"); free(queue); exit(1); } else{ front = (++(front)) % queueSize; value = queue[front - 1]; queue[front] = 0; return value; } } void main(){ char select; int calculateSize, value; rear = 0; front = 0; scanf("%d", &queueSize); queue = (int *)malloc(sizeof(int)*queueSize); for (int i = 0; i < queueSize; i++){ queue[i] = 0; } scanf("%d", &calculateSize); for (int i = 0; i < calculateSize; i++){ getchar(); scanf("%c", &select); if (select == 'I'){ scanf("%d", &value); enqueue(value); } else if (select == 'D'){ dequeue(); } else if (select == 'P'){ printQueue(); } } free(queue); } |
[문제2] 데크를 헤더와 테일이 없는 이중연결리스트로 구현하는 프로그램
- 데크 : 큐의 전단(front)와 후단(rear)에서 모두 삽입과 삭제가 가능한 자료구조
- AF value : 데크의 front에 value를 삽입
- AR value : 데크의 rear에 value를 삽입
- DF : 데크의 front에 데이터를 삭제
- DR : 데크의 rear의 리스트를 삭제
입력예시 출력예시
14 AF 10 AF 20 AF 30 AR 40 AR 50 P DF DF DR P DF DR DR |
30 20 10 40 50 10 40 underflow |
#include<stdio.h> #include<stdlib.h> #include<string.h> struct node{ int element; struct node *next; struct node *prev; }; int dequeNumber; struct node *deque, *rear, *front; void delete_front(){ struct node *p; if (dequeNumber == 0){ printf("underflow\n"); exit(1); } else{ p = front; if (dequeNumber == 1){ free(p); } else{ front = front->next; front->prev = NULL; free(p); } } } void delete_rear(){ struct node *p; if (dequeNumber == 0) { printf("underflow\n"); exit(1); } else{ p = rear; if (dequeNumber == 1){ free(p); } else{ rear = rear->prev; rear->next = NULL; free(p); } } } void add_front(int value){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->element = value; newnode->prev = NULL; newnode->next = front; newnode->next->prev = newnode; front = newnode; } void add_rear(int value){ struct node *newnode = (struct node*)malloc(sizeof(struct node)); newnode->element = value; newnode->prev = rear; newnode->next = NULL; newnode->prev->next = newnode; rear = newnode; } void print(){ struct node *p = front; while (p != NULL){ printf(" %d", p->element); p = p->next; } printf("\n"); } void freeDeque() { struct node *temp = front; while (temp != NULL) { front = front->next; free(temp); temp = front; } } void main(){ int calculateSize, value; char calculate[5]; dequeNumber = 0; scanf("%d", &calculateSize); getchar(); for (int i = 0; i < calculateSize; i++){ scanf("%s", &calculate); getchar(); if (strcmp(calculate, "AF") == 0){ scanf("%d", &value); getchar(); if (dequeNumber == 0){ deque = (struct node*)malloc(sizeof(struct node)); deque->element = value; deque->next = NULL; deque->prev = NULL; front = deque; rear = deque; dequeNumber++; } else{ add_front(value); dequeNumber++; } } else if (strcmp(calculate, "AR") == 0){ scanf("%d", &value); getchar(); if (dequeNumber == 0) { deque = (struct node*)malloc(sizeof(struct node)); deque->element = value; deque->next = NULL; deque->prev = NULL; front = deque; rear = deque; dequeNumber++; } else { add_rear(value); dequeNumber++; } } else if (strcmp(calculate, "DF") == 0){ delete_front(); dequeNumber--; } else if (strcmp(calculate, "DR") == 0){ delete_rear(); dequeNumber--; } else if (strcmp(calculate, "P") == 0){ print(&front); } } freeDeque(); } |
'알고리즘' 카테고리의 다른 글
[알고리즘] 기본 추상자료형(8) - 예제(트리ADT) (0) | 2018.12.05 |
---|---|
[알고리즘] 기본 추상자료형(7) - 설명(트리ADT, 이진트리ADT) (0) | 2018.12.05 |
[알고리즘] 기본 추상자료형(5) - 예제(스택ADT) (2) | 2018.11.29 |
[알고리즘] 기본 추상자료형(4) - 예제(스택ADT) (4) | 2018.11.28 |
[알고리즘] 기본 추상자료형(3) - 설명(스택ADT, 큐ADT) (0) | 2018.11.28 |