코딩하는 해맑은 거북이
[자료구조] 큐(Queue), 원형 큐, 회문 판정 본문
큐(Queue) : FIFO (First-in-First-Out)
삽입(rear)과 삭제(front)가 다른 장소에서 이루어지는 순서 리스트
배열 큐 구현
- 큐 구조 정의
#define Max_Queue_Size 10 // 최대 큐크기
typedef int element;
element queue[Max_Queue_Size];
int rear = -1;
int front = -1;
- 큐의 구현 방식
1) 선형 큐 : 단순 선형 배열로 구현한 큐로 포화 상태(Full)일 경우 배열을 조정해야 한다.
2) 원형 큐 : 선형 큐의 해결방법으로 큐의 시작과 끝이 마치 원으로 연결된 것 같이 사용한다.
- 원형 큐는 rear과 front를 최초 0에서부터 시작한다.
- rear = (rear+1) mod MAX_QUEUE_SIZE
- front = (front+1) mod MAX_QUEUE_SIZE
- 공백 상태
int is_empty()
{
return (front == rear);
}
- 포화 상태
int is_full()
{
return (front == (rear + 1) % Max_Queue_Size);
}
- 삽입
void enqueue(element item)
{
if (is_full()) {
printf("Queue full\n");
return;
}
else {
rear = (rear + 1) % Max_Queue_Size;
queue[rear] = item;
}
}
- 삭제
element dequeue()
{
if (is_empty()) {
printf("Queue empty\n");
return;
}
else {
front = (front + 1) % Max_Queue_Size;
return queue[front];
}
}
응용
회문 판정 (스택&큐 사용)
주어진 입력 문자열이 거꾸로 읽어도 똑같은지 판별하는 문제이다.
(ex) aabbaa : 회문O
aabbbb : 회문X
입력 받은 문자열을 Stack과 Queue에 한 문자씩 모두 push, euqueue 해준다.
그리고 'Stack에서 pop한 값'과 'Queue에서 dequeue한 값'을 비교하여 서로 다르다면 회문이 아니고,
모든 문자열을 비교하여 Stack과 Queue가 비었을 때까지 서로 같다면 회문이라고 판정한다.
void main() { char temp[MAX_SIZE]; printf("입력 : "); scanf("%s", temp); for (int i = 0;i < strlen(temp);i++) { push(temp[i]); enqueue(temp[i]); } char p1, p2; while (true) { p1 = dequeue(); p2 = pop(); if ((p1 == 0) && (p2 == 0)) { printf("회문입니다.\n"); return; } else if (p1 != p2) { printf("회문이 아닙니다.\n"); return; } } }
전체 소스코드#include<stdio.h> #include<string.h> #define MAX_SIZE 100 typedef char element; element queue[MAX_SIZE]; int rear = -1; int front = -1; element stack[MAX_SIZE]; int top = -1; void push(char word) { if (top == MAX_SIZE - 1) { return; } else { stack[++top] = word; } } char pop() { if (top == -1) return 0; else return stack[top--]; } void enqueue(char word) { if (front == (rear + 1) % MAX_SIZE) { return; } else { rear = (rear + 1) % MAX_SIZE; queue[rear] = word; } } char dequeue() { if (front == rear) return 0; else front = (front + 1) % MAX_SIZE; return queue[front]; } void main() { char temp[MAX_SIZE]; printf("입력 : "); scanf("%s", temp); for (int i = 0;i < strlen(temp);i++) { push(temp[i]); enqueue(temp[i]); } char p1, p2; while (true) { p1 = dequeue(); p2 = pop(); if ((p1 == 0) && (p2 == 0)) { printf("회문입니다.\n"); return; } else if (p1 != p2) { printf("회문이 아닙니다.\n"); return; } } }
'Data Structure' 카테고리의 다른 글
[자료구조] 정렬(Sort) (0) | 2023.02.05 |
---|---|
[자료구조] 트리(Tree), 이진트리, 이진트리 순회, 이진탐색트리(BST) (0) | 2023.02.05 |
[자료구조] 스택(Stack), 괄호검사, 후위식 계산, 중위식의 후위식 변환 (0) | 2023.02.03 |
[자료구조] 연결리스트(Linked List) (0) | 2023.02.03 |
[자료구조] 배열 및 구조체, 다항식 덧셈, 희소행렬 전치 (0) | 2023.02.03 |
Comments