덱을 큐처럼 사용 할 수 있으니 덱을 이용해서 큐를 구현할 수 있다!!
구현해봐라 !
DequeBaseQueue.h
#ifndef DequeBaseQueue_h
#define DequeBaseQueue_h
#include "Deque.h"
typedef Deque Queue;
void QueueInit(Queue * pq);
int QIsEmpty(Queue * pq);
void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);
#endif
DequeBaseQueue.c
#include "DequeBaseQueue.h"
void QueInit(Queue * pq)
{
DequeInit(pq);
}
int QIsEmpty(Queue * pq)
{
return DQIsEmpty(pq);
}
void Enqueue(Queue*pq,Data data)
{
DQAddLast(pq, data);
}
Data Dequeue(Queue * pq)
{
return DQRemoveFirst(pq);
}
Data QPeek(Queue * pq)
{
return DQGetFirst(pq);
}
생각외로 간단하지 않는가..?
그 이유는 앞에서 삽입/빼기 뒤에서 삽입/빼기 가 가능한 이미 만들어진 덱의 함수에서 큐를 구현한다는 것은
그저 데이터를 추가할때는 뒤로 넣는 함수를 데이터를 뺄 때는 앞에서 빼는 함수를 가져오면 되기 때문이다!!
이미 모든것들은 준비가 완료 된 상황이니 그저 가져오기만 하면 되니 편하게 구성 할 수 있다.
덱의 헤더파일과 씨 파일은 추가로 남기겠다 !
+Deque.h,Deque.c file
Deque.c
#include <stdio.h>
#include <stdlib.h>
#include "Deque.h"
void DequeInit(Deque * pdeq)
{
pdeq->head = NULL;
pdeq->tail = NULL;
}
int DQIsEmpty(Deque * pdeq)
{
if(pdeq->head == NULL)
return TRUE;
else
return FALSE;
}
void DQAddFirst(Deque * pdeq, Data data)
{
Node * newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = pdeq->head;
if(DQIsEmpty(pdeq))
pdeq->tail = newNode;
else
pdeq->head->prev = newNode;
newNode->prev = NULL;
pdeq->head = newNode;
}
void DQAddLast(Deque * pdeq, Data data)
{
Node * newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = pdeq->tail;
if(DQIsEmpty(pdeq))
pdeq->head = newNode;
else
pdeq->tail->next = newNode;
newNode->next = NULL;
pdeq->tail = newNode;
}
Data DQRemoveFirst(Deque * pdeq)
{
Node * rnode = pdeq->head;
Data rdata = pdeq->head->data;
if(DQIsEmpty(pdeq))
{
printf("Deque Memory Error!");
exit(-1);
}
pdeq->head = pdeq->head->next;
free(rnode);
if(pdeq->head == NULL)
pdeq->tail = NULL;
else
pdeq->head->prev = NULL;
return rdata;
}
Data DQRemoveLast(Deque * pdeq)
{
Node * rnode = pdeq->tail;
Data rdata = pdeq->tail->data;
if(DQIsEmpty(pdeq))
{
printf("Deque Memory Error!");
exit(-1);
}
pdeq->tail = pdeq->tail->prev;
free(rnode);
if(pdeq->tail == NULL)
pdeq->head = NULL;
else
pdeq->tail->next = NULL;
return rdata;
}
Data DQGetFirst(Deque * pdeq)
{
if(DQIsEmpty(pdeq))
{
printf("Deque Memory Error!");
exit(-1);
}
return pdeq->head->data;
}
Data DQGetLast(Deque * pdeq)
{
if(DQIsEmpty(pdeq))
{
printf("Deque Memory Error!");
exit(-1);
}
return pdeq->tail->data;
}
Deque.h
#ifndef __DEQUE_H__
#define __DEQUE_H__
#define TRUE 1
#define FALSE 0
typedef int Data;
typedef struct _node
{
Data data;
struct _node * next;
struct _node * prev;
} Node;
typedef struct _dlDeque
{
Node * head;
Node * tail;
} DLDeque;
typedef DLDeque Deque;
void DequeInit(Deque * pdeq);
int DQIsEmpty(Deque * pdeq);
void DQAddFirst(Deque * pdeq, Data data);
void DQAddLast(Deque * pdeq, Data data);
Data DQRemoveFirst(Deque * pdeq);
Data DQRemoveLast(Deque * pdeq);
Data DQGetFirst(Deque * pdeq);
Data DQGetLast(Deque * pdeq);
#endif