티스토리 뷰
[연결 리스트 기반 스택과 큐의 차이점]
- 스택은 'push'와 'pop'이 같은 위치에서 처리가 되는 반면, 큐는 'enqueue'와 'dequeue'가 다른 위치에서 처리가 됨
[소스 코딩]
■ ListBaseQueue.h
#ifndef LISTBASEQUEUE_H_ #define LISTBASEQUEUE_H_ #define TRUE 1 #define FALSE 0 typedef struct _node { int data; struct _node * next; } Node; typedef struct _lQueue { Node * front; // 삭제할 노드를 가리키는 용도 Node * rear; // 생성된 노드를 가리키는 용도 } LQueue; typedef LQueue Queue; void QueueInit(Queue * pq); // 큐 초기화 함수 int QIsEmpty(Queue * pq); // 큐에 데이터가 존재하는지 확인하는 함수 void Enqueue(Queue * pq, int data); // 큐에 데이터를 저장하는 함수 int Dequeue(Queue * pq); // 큐의 데이터를 반환하는 함수 int QPeek(Queue * pq); // 큐의 데이터를 조회하는 함수 #endif | cs |
■ ListBaseQueue.c
#include <stdio.h> #include <stdlib.h> // malloc, free 함수를 사용하기 위함 #include "ListBaseQueue.h" // 큐 초기화 함수 // void QueueInit(Queue * pq) { pq->front = NULL; pq->rear = NULL; } // 큐에 데이터가 존재하는지 확인하는 함수 // int QIsEmpty(Queue * pq) { if(pq->front == NULL) return TRUE; else return FALSE; } // 큐에 데이터를 저장하는 함수 // void Enqueue(Queue * pq, int data) { Node * newNode = (Node*)malloc(sizeof(Node)); newNode->next = NULL; newNode->data = data; if(QIsEmpty(pq)) { pq->front = newNode; pq->rear = newNode; } else { pq->rear->next = newNode; pq->rear = newNode; } } // 큐의 데이터를 반환하는 함수 // int Dequeue(Queue * pq) { Node * delNode; int retData; if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } delNode = pq->front; retData = delNode->data; pq->front = pq->front->next; free(delNode); return retData; } // 큐의 데이터를 조회하는 함수 // int QPeek(Queue * pq) { if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } return pq->front->data; } | cs |
■ 사용되는 함수 설명
void QueueInit(Queue * pq) { pq->front = NULL; pq->rear = NULL; } | cs |
- 노드를 가리킬 'front'와 'rear'를 'NULL'로 초기화
int QIsEmpty(Queue * pq) { if(pq->front == NULL) return TRUE; else return FALSE; } | cs |
// 'front'가 'NULL'을 가리킬 경우
- 'TRUE'를 반환
// 아닐 경우
- 'FALSE'를 반환
void Enqueue(Queue * pq, int data) { Node * newNode = (Node*)malloc(sizeof(Node)); newNode->next = NULL; newNode->data = data; if(QIsEmpty(pq)) { pq->front = newNode; pq->rear = newNode; } else { pq->rear->next = newNode; pq->rear = newNode; } } | cs |
- 새로운 노드(newNode)를 생성(동적 메모리 할당)
- 새로운 노드는 항상 끝을 의미하기 위해 'next'를 'NULL'로 초기화
- 새로운 노드에 사용자에게 입력 받은 'data'를 저장
// 큐에 데이터가 비워져 있을 경우('front'가 'NULL'을 가리킴)
- 'front'와 'rear'는 생성된 노드(newNode)를 가리킴
// 큐에 데이터가 존재할 경우
- 'rear'가 가리키던 기존 노드는 새로운 노드를 가리킴
※ 가장 최근에 생성된 노드가 새로운 노드를 가리킴
- 'rear'는 생성된 노드를 가리킴으로써 위치 이동
※ enqueue 처리 과정
int Dequeue(Queue * pq) { Node * delNode; int retData; if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } delNode = pq->front; retData = delNode->data; pq->front = pq->front->next; free(delNode); return retData; } | cs |
- 삭제할 노드를 저장할 'delNode' 선언
- 반환할 노드의 값을 저장할 'retData' 선언
// 큐에 데이터가 비워져 있을 경우('front'가 'NULL'을 가리킴)
- 큐에 데이터가 존재하지 않다는 메시지 출력 후 프로그램 종료
// 큐에 데이터가 존재할 경우
- 'front'가 가리키던 노드를 'delNode'에 저장
- 'delNode'에 저장된 data를 'retData'에 저장
- 'front'는 삭제될 노드의 다음 노드를 가리킴
- 'delNode'를 삭제하고, 저장되었던 값을 반환
int QPeek(Queue * pq) { if(QIsEmpty(pq)) { printf("Queue Memory Empty!!"); exit(-1); } return pq->front->data; } | cs |
// 큐에 데이터가 비워져 있을 경우('front'가 'NULL'을 가리킴)
- 큐에 데이터가 존재하지 않다는 메시지 출력 후 프로그램 종료
// 큐에 데이터가 존재할 경우
- 'front'가 가리키던 노드의 값을 반환
※ dequeue 처리 과정
■ ListBaseQueueMain.c
#include <stdio.h> #include "ListBaseQueue.h" int main(void) { Queue Q; QueueInit(&Q); Enqueue(&Q, 11); Enqueue(&Q, 22); Enqueue(&Q, 33); Enqueue(&Q, 44); while(!QIsEmpty(&Q)) printf("%d ", Dequeue(&Q)); return 0; } | cs |
- 연결 리스트 기반 구조체 'Q' 선언 및 초기화
- 데이터 저장(11 → 22 → 33 → 44)
- Q에 데이터가 비워질 때까지 존재하는 데이터를 순서대로 출력
■ 실행결과
'자료구조' 카테고리의 다른 글
[ch 07-5] 덱의 이해와 구현 (0) | 2016.04.12 |
---|---|
[ch 07-4] 큐의 활용(시뮬레이션 구현) (0) | 2016.04.12 |
[ch 07-2] 큐의 배열 기반 구현_2(구현) (0) | 2016.04.08 |
[ch 07-2] 큐의 배열 기반 구현_1(데이터 저장/반환, 원형 큐 개념) (2) | 2016.04.08 |
[ch 07-1] 큐의 이해와 ADT 정의 (0) | 2016.04.07 |
- Total
- Today
- Yesterday
- wfd
- 응용
- SWT
- 대상
- java
- 작문
- RA
- 알고리즘
- 상황
- Delphi
- 독해
- 스택
- 설명
- 계산기
- ADODB
- VCL
- Reference
- SysUtils
- Pte
- 말하기
- System
- 영어
- 정렬
- 일기
- 문법
- 자료구조
- 여행영어 100일의 기적
- tdataset
- 교육센터
- 왕초보 영어회화 100일의 기적
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |