C언어로 덱(Deque) 구현하기

2023. 1. 31. 18:01·자료구조(Data Structure)

덱이란?

일반적인 큐, 원형큐에서는 rear에서 삽입, front에서 삭제가 가능했다.

Deque은 double edged queue의 줄임말로, 큐의 front, rear에서 삽입, 삭제가 모두 가능한 큐를 말한다.

큐, 스택과 마찬가지로 중간에서 삽입과 삭제는 일어나지 않는다.


덱을 구현하기 위해 필요한 것

1. 덱 생성

2. 덱 초기화

3. 공백상태인지 포화상태인지 검사

4. add_front(앞에 추가) / add_rear(뒤에 추가)

5. delete_front(앞에서 삭제) / delete_rear(뒤에서 삭제)

6. get_front(뒤에서 요소반환) / get_rear(뒤에서 요소반환)

7. 덱 출력


1. 덱 생성

#include <stdio.h>
#define MAX_DEQUE 5

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

 

2. 덱 초기화

void init_deque(DequeType *dq)
{
    dq->front = 0;
    dq->rear = 0;
}

덱을 초기화할 때, front = 0 rear = 0이 된다.(0부터 시작)

 

3. 공백상태인지 포화상태인지 검사

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

int is_full(DequeType *dq)
{
    if(dq->front == (dq->rear + 1) % MAX_DEQUE)
        return 1; //포화 상태
    else
        return 0;
}

포화상태는 (rear+1)%MAX_DEQUE이 front와 같다면 포화상태라고 판단한다.

 

4. add_front(앞에 추가) / add_rear(뒤에 추가)

void add_front(DequeType *dq, element item)
{
    if(is_full(dq) == 1){
        printf("full\n");
    }
    else{
        dq->data[dq->front] = item;
        dq->front = (dq->front - 1 + MAX_DEQUE) % MAX_DEQUE;
    }
}

front에 데이터 삽입할 때, 일단 front에 데이터 삽입 후, 반시계 방향으로 한칸 이동.

 

void add_rear(DequeType *dq, element item)
{
    if(is_full(dq) == 1){
        printf("full\n");
    }
    else{
        dq->rear = (dq->rear + 1) % MAX_DEQUE;
        dq->data[dq->rear] = item;
    }
}

rear에 데이터를 삽입할 때, rear를 시계방향으로 한칸 이동 후, 데이터 삽입한다.

 

5. delete_front(앞에서 삭제) / delete_rear(뒤에서 삭제)

int delete_front(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        dq->front = (dq->front + 1) % MAX_DEQUE;
        return dq->data[dq->front];
    }
}

앞에서 삭제할 때, front를 시계방향으로 한칸 이동 후, 데이터를 삭제한다.

 

int delete_rear(DequeType *dq)
{
    element item;
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        item = dq->data[dq->rear];
        dq->rear = (dq->rear - 1 + MAX_DEQUE) % MAX_DEQUE;
        return item;
    }
}

 

뒤에서 삭제할 때, 일단 현재의 rear에 있는 데이터를 item변수에 넣어 놓고,

rear를 반시계 방향으로 한칸 이동한다.

그리고 미리 넣어놨던 item을 출력함.

 

6. get_front(앞에서 요소반환) / get_rear(뒤에서 요소반환)

int get_front(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        return dq->data[(dq->front + 1) % MAX_DEQUE];
    }
}

앞에서 요소만 반환할 때, dq->front = (dq->front+1)%MAX_DEQUE를 안하는 이유는,

front의 위치를 변경할 필요가 없기 때문이다.

why? front의 위치를 변경한다는건 요소를 삭제하는 것과 같다.

그래서, 현재 위치해 있는 front보다 시계방향으로 한칸앞에  있는 요소를 뽑아내면 된다.(front의 위치를 변경하는게 아님에 주의하자!)

 

int get_rear(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        return dq->data[dq->rear];
    }
}

뒤에서 요소만 반환할 때, 그냥 rear위치에 있는 요소만 반환하면 된다.

rear를 이동시키지 않아도 된다.

 

7.덱 출력

void print_deque(DequeType *dq)
{
    printf("(front = %d rear = %d) = ");
    if(!is_empty(dq) == 1){
        int i = dq->front;
        do{
            i = (i + 1) % MAX_DEQUE;
            printf("%d | ", dq->data[i]);
            if(i == dq->rear)
                break;
        } while(i != dq->front);
        printf("\n");
    }
}

전체코드를 확인하고, 결과를 보자

#include <stdio.h>
#define MAX_DEQUE 5

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

void init_deque(DequeType *dq)
{
    dq->front = 0;
    dq->rear = 0;
}

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

int is_full(DequeType *dq)
{
    if(dq->front == (dq->rear + 1) % MAX_DEQUE)
        return 1; //포화 상태
    else
        return 0;
}

void add_front(DequeType *dq, element item)
{
    if(is_full(dq) == 1){
        printf("full\n");
    }
    else{
        dq->data[dq->front] = item;
        dq->front = (dq->front - 1 + MAX_DEQUE) % MAX_DEQUE;
    }
}

void add_rear(DequeType *dq, element item)
{
    if(is_full(dq) == 1){
        printf("full\n");
    }
    else{
        dq->rear = (dq->rear + 1) % MAX_DEQUE;
        dq->data[dq->rear] = item;
    }
}

int delete_front(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        dq->front = (dq->front + 1) % MAX_DEQUE;
        return dq->data[dq->front];
    }
}

int delete_rear(DequeType *dq)
{
    element item;
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        item = dq->data[dq->rear];
        dq->rear = (dq->rear - 1 + MAX_DEQUE) % MAX_DEQUE;
        return item;
    }
}

int get_front(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        return dq->data[(dq->front + 1) % MAX_DEQUE];
    }
}

int get_rear(DequeType *dq)
{
    if(is_empty(dq) == 1){
        printf("empty\n");
    }
    else{
        return dq->data[dq->rear];
    }
}

void print_deque(DequeType *dq)
{
    printf("(front = %d rear = %d) = ", dq->front, dq->rear);
    if(!is_empty(dq) == 1){
        int i = dq->front;
        do{
            i = (i + 1) % MAX_DEQUE;
            printf("%d | ", dq->data[i]);
            if(i == dq->rear)
                break;
        } while(i != dq->front);
        printf("\n");
    }
}

int main(void)
{
    DequeType dq;
    init_deque(&dq);

    add_rear(&dq, 1); //뒤에 삽입
    print_deque(&dq);

    add_rear(&dq, 2); //뒤에 삽입
    print_deque(&dq);

    add_front(&dq, 3); //앞에 삽입
    print_deque(&dq);

    delete_rear(&dq); //뒤에서 삭제
    print_deque(&dq);

    delete_front(&dq); //앞에서 삭제
    print_deque(&dq);

    return 0;
}

 

결과

 

이상 끝!

'자료구조(Data Structure)' 카테고리의 다른 글

C언어로 연결리스트(Linked List) 구현하기  (0) 2023.02.03
C언어로 리스트 구현하기  (0) 2023.02.01
원형큐 구현하기  (2) 2023.01.25
C언어로 큐(Queue) 구현하기  (0) 2023.01.23
동적 배열 스택 구현하기  (0) 2023.01.23
'자료구조(Data Structure)' 카테고리의 다른 글
  • C언어로 연결리스트(Linked List) 구현하기
  • C언어로 리스트 구현하기
  • 원형큐 구현하기
  • C언어로 큐(Queue) 구현하기
Minu Jin
Minu Jin
정보의 바다
  • Minu Jin
    뇌 구조가 바이너리
    Minu Jin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    commit
    드라이버 분석
    rubikpi3
    백준
    커널
    스택
    Git
    동적메모리
    arm
    Branch
    이진 트리
    소수
    버퍼
    리눅스
    rubik pi
    Qualcomm
    포인터
    자료구조
    앤드류모튼
    토발즈
    파일 입출력
    커널 기여
    피보나치
    C++
    INIT
    순환
    yolo
    파이썬
    c언어
    시스템콜
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minu Jin
C언어로 덱(Deque) 구현하기
상단으로

티스토리툴바