일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘
- 코딩테스트 고득점 kit
- 자바
- 프로그래머스
- 정보처리기사
- 자료구조
- DP
- 골드4
- 도커
- 카테부
- Express
- ETRI
- 디자인패턴
- 카카오테크 부트캠프
- 대전
- 골드3
- 백준 알고리즘
- 정처기
- 엘라스틱빈스톡
- 배포
- Docker
- 스프링 부트
- EC2
- BFS
- express.js
- 골드5
- 인스턴스
- 한국전자통신연구원
- DFS
- aws
Archives
JUINTINATION
덱(Deque) 본문
반응형
덱이란?
- double-ended queue의 줄임말, "deck"과 발음이 같음
- 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조
- 두 개의 포인터를 사용하여, 양쪽에서 삭제와 삽입을 발생시킬 수 있다. 큐와 스택을 합친 형태로 생각할 수 있다.
덱의 주요 연산
- add_front(dq, e) :덱의 앞에 요소 삽입
- add_rear(dq, e) : 덱의 뒤에 요소 삽입
- delete_front(dq) : 덱의 앞에 있는 요소를 반환한 다음 삭제
- delete_rear(dq) : 덱의 뒤에 있는 요소를 반환한 다음 삭제
- get_front(dq) : 덱의 앞에서 삭제하지 않고 앞에 있는 요소를 반환
- get_rear(dq) : 덱의 뒤에서 삭제하지 않고 뒤에 있는 요소를 반환
배열을 이용한 덱 구현
#define DEQUE_SIZE 100
int arr[DEQUE_SIZE];
int f = DEQUE_SIZE / 2, r = DEQUE_SIZE / 2;
void add_front(int x) {
arr[f--] = x;
}
void add_back(int x) {
arr[++r] = x;
}
int is_empty() {
if (r == f) return 1;
else return 0;
}
int delete_front() {
if (is_empty()) return -1;
else {
int re = arr[f + 1];
arr[++f] = 0;
return re;
}
}
int delete_back() {
if (is_empty()) return -1;
else {
int re = arr[r];
arr[r--] = 0;
return re;
}
}
int get_front() {
if (is_empty()) return -1;
else return arr[f + 1];
}
int get_rear() {
if (is_empty()) return -1;
else return arr[r];
}
연결리스트를 이용한 덱 구현
typedef struct node {
int data;
struct node* prev;
struct node* next;
} node;
typedef struct {
node* front;
node* rear;
int count;
} Deque;
void initDeque(Deque* deque) {
deque->front = deque->rear = NULL;
deque->count = 0;
}
int is_empty(Deque* deque) {
if (deque->count == 0) return 1;
else return 0;
}
void add_front(Deque* deque, int data) {
node* now = (node*)malloc(sizeof(node));
if (is_empty(deque)) {
deque->front = now;
deque->rear = now;
now->next = NULL;
}
else {
deque->front->prev = now;
now->next = deque->front;
deque->front = now;
}
now->prev = NULL;
now->data = data;
(deque->count)++;
}
void add_back(Deque* deque, int data) {
node* now = (node*)malloc(sizeof(node));
if (is_empty(deque)) {
deque->front = now;
deque->rear = now;
now->prev = NULL;
}
else {
now->prev = deque->rear;
deque->rear->next = now;
deque->rear = now;
}
now->next = NULL;
now->data = data;
(deque->count)++;
}
int delete_front(Deque* deque) {
if (is_empty(deque)) return -1;
else {
int rdata;
node* rnode;
rdata = deque->front->data;
rnode = deque->front;
deque->front = deque->front->next;
if (deque->count == 1) deque->rear = NULL;
free(rnode);
(deque->count)--;
return rdata;
}
}
int delete_back(Deque* deque) {
if (is_empty(deque)) return -1;
else {
int rdata;
node* rnode;
rdata = deque->rear->data;
rnode = deque->rear;
deque->rear = deque->rear->prev;
if (deque->count == 1) deque->rear = NULL;
free(rnode);
(deque->count)--;
return rdata;
}
}
int get_front(Deque* deque) {
if (is_empty(deque)) return -1;
else return deque->front->data;
}
int get_rear(Deque* deque) {
if (is_empty(deque)) return -1;
else return deque->rear->data;
}
반응형
'자료구조 및 알고리즘' 카테고리의 다른 글
깊이우선탐색(DFS)과 너비우선탐색(BFS) (2) | 2023.01.15 |
---|---|
동적 계획법(dynamic programming) (0) | 2022.07.16 |
큐(Queue) (0) | 2022.07.01 |
스택(Stack) (0) | 2022.07.01 |
정렬(Sort) (0) | 2022.06.26 |
Comments