deque
CS/Data Structure & Algorithm

deque

deque

 

double-end queue

 

deque의 구조

 

deque의 특징

 

전단과 후단에서 모두 삽입 삭제가 가능하다

데이터 구조에서는 좀 더 연산이 간단한 데이터구조를 채택하여 사용하는 것이 효율적 & 지향한다

 

deque의 용도

 

- 키보드 입력 버퍼

- screen scroll

 

deque ADT

 

"add와 delete가 양 쪽으로 있다"

create(max_size)

- 최대 크기가 max_size인 덱 생성

init(dq)

- 덱 초기화

is_empty(dq)

- if (size == 0) return TRUE;

  else return FALSE;

is_full(dq)

- if (size == max_size) return TRUE;

  else return FALSE;

add_front(dq, e)

- if (is_full(q)) full로 인한 오류;

  else q의 끝에 e를 추가

add_rear(dq, e)

- if (is_full(q)) full로 인한 오류;

  else q의 끝에 e를 추가

delete_front(dq)

- if (is_empty(q)) empty로 인한 오류;

  else q의 맨 앞에 있는 e를 제거하여 return

delete_rear(dq)

- if (is_empty(q)) empty로 인한 오류;

  else q의 맨 앞에 있는 e를 제거하여 return

get_front(q)

- if (is_empty(q)) empty로 인한 오류;

  else q의 맨 앞에 있는 e를 읽어서 return

get_rear(q)

- if (is_empty(q)) empty로 인한 오류;

  else q의 맨 앞에 있는 e를 읽어서 return

 

덱 동작원리

 

배열을 이용한 덱 실제 구현 - 원형큐 사용

 

#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 5

typedef int element;
typedef struct {
	int front;
    int rear;
    element data[MAX_QUEUE_SIZE];
} DequeType;

// 오류함수
void error(char *message)
{
	fprintf(stderr, "%s\n", message);
    exit(1)
}

// 덱 초기화
void init_queue(DequeType *q)
{
	q->rear = 0;		// -1 -> 0
    q->front = 0;		// -1 -> 0
}

// 현재 덱 현황 출력 함수
void queue_print(DequeType *q)
{
	if (!is_empty(q)) {		// 돌아가는건 그림 그려서 예시들어서 하면 쉬움
    	int i = q->front;
        do {
        	i = (i + 1) % MAX_QUEUE_SIZE;
            printf("%d | ", q->data[i]);
            if (i == q->rear)
            	break;
        } while(i != q->front);
    }
    printf("\n");
}

// 덱 포화상태 확인
int is_full(DequeType *q) 
{
	if (q->front == (q->rear+1) % MAX_QUEUE_SIZE)
    	return 1;
    else
    	return 0;
}

// 덱 공백상태 확인
int is_empty(DequeType *q)
{
	if (q->front == q->rear)
    	return 1;
    else
    	return 0;
}

// 큐 (일반적인 큐와 똑같다)
// 덱 데이터 후단 추가
void add_rear(DequeType *q, int item)
{
	// error 처리
	if (is_full(q)) {
    	printf("큐가 포화상태 입니다.");
    }
    q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;		// 추가 방법 다름
    q->data[q->rear] = item;
}

// 덱 데이터 전단 삭제
void delete_front(DequeType *q)
{
	// error 처리
	if (is_full(q)) {
    	printf("큐가 공백상태 입니다.");
        return -1;
    }
    q->front = (q->front + 1) % MAX_QUEUE_SIZE;		// 삭제 방법 다름
    return q->data[q->front];
}

// 스택 (원형큐에서 스택기능을 구현)
// 덱 데이터 전단 추가
void add_front(DequeType *q, int item)
{
	// error 처리
	if (is_full(q)) {
    	printf("큐가 포화상태 입니다.");
    }
    // 추가 방법 다름
    q->data[q->front] = item;
    q->front = (q->front - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
}

// 새로운 덱만의 기능
// 덱 데이터 후단 삭제
void delete_rear(DequeType *q)
{
	// error 처리
	if (is_full(q)) {
    	printf("큐가 공백상태 입니다.");
        return -1;
    }
    // 삭제 방법 다름
    int prev = q->rear;
    q->rear = (q->rear - 1 + MAX_QUEUE_SIZE) % MAX_QUEUE_SIZE;
    return q->data[prev];
}

// 메인 함수 사용자 사용
int main(void)
{
	int item = 0;
    QueueType q;
    
    init_queue(&q);
	
    enqueue(&q, 10); queue_print(&q);
    //...
    dequeue(&q); queue_print(&q);
    //...
    return 0;
}

'CS > Data Structure & Algorithm' 카테고리의 다른 글

[String] 1. 문자 찾기  (0) 2022.08.04
List  (0) 2021.12.02
Queue  (0) 2021.11.25
Stack  (0) 2021.11.23
Recursion (<-> Iteration)  (0) 2021.11.23