본문 바로가기
CS/Data structures

[자료구조] C언어 - 큐(queue) 구현 - 객체지향

by Nahwasa 2022. 4. 9.

- C언어로 구현한 큐(queue) 코드이다. 완벽하진 않지만 c에서 객체지향 개념을 넣을 수 있는 기본 베이스는 마련해둔 코드이다.

 

- 글 말고 github으로 보려면 여기를 누르면 된다.

 

- 영어를 잘 못하지만 주석을 영어로 작성했으므로 틀린 표현이 많을 수 있다. (댓글로 알려줘요 ㅠ)

 

- 이하 코드에서 사용된 node.h, list.h, list.c는 '[자료구조] C언어 - 이중 연결 리스트(doubly linked list) 구현 - 객체지향' 글에서 구현한 코드들이다. 위 github에서 보거나, 여기를 눌러 해당 글에서 확인하면 된다.

 

 

0. 사용예시

#include<stdio.h>
#include"queue.h"

int main(int argc, char* argv[])
{
	queue_t* q = create_queue();

	q->op->enqueue(q, "aa");
	q->op->enqueue(q, "bb");
	q->op->enqueue(q, "cc");
	q->op->enqueue(q, "dd");
	
	printf("%s\n", (char*) q->op->dequeue(q));
	printf("%s\n", (char*) q->op->dequeue(q));	
	printf("%s\n", (char*) q->op->peekqueue(q));	
	printf("%s\n", (char*) q->op->dequeue(q));	
	printf("%s\n", (char*) q->op->dequeue(q));

	q->op->destroy(q);
}

 

1. queue.h

/**
* Queue Header
* OOP Style
* made by nahwasa
*/

#ifndef QUEUE_H_NAHWASA
#define QUEUE_H_NAHWASA

#include"node.h"
#include"list.h"

typedef struct queue_head {
	list_t* list;
	struct queue_operations* op;
} queue_t;


struct queue_operations {
	void (*enqueue)(struct queue_head* q, void* data);
	void* (*dequeue)(struct queue_head* q);
	void* (*peekqueue)(struct queue_head* q);
	void (*destroy)(queue_t* q);
	int (*get_size)(queue_t* q);
	int (*is_empty)(queue_t* q);
};

extern queue_t* create_queue();

#endif

 

2. queue.c

/**
* Queue (using basic_list)
* OOP Style
* made by nahwasa
*/

#include<stdio.h>
#include<stdlib.h>
#include"queue.h"

static void destroy(queue_t* q);
static void enqueue(queue_t* q, void* data);
static void* dequeue(queue_t* q);
static void* peekqueue(queue_t* q);
static int get_size(queue_t* q);
static int is_empty(queue_t* q);


static struct queue_operations op =
	{
		.destroy = destroy,
		.enqueue = enqueue,
		.dequeue = dequeue,
		.peekqueue = peekqueue,
		.get_size = get_size,
		.is_empty = is_empty
	};

/*
* create queue object and return
*/
queue_t* create_queue()
{
	queue_t* q = (queue_t*)malloc(sizeof(queue_t));

	q->list = create_list();
	q->op = &op;

	return q;
}

/*
* release memory
*/
static void destroy(queue_t* q)
{
	q->list->op->destroy(q->list);
	q->list = NULL;
	q->op = NULL;
	free(q);
	q = NULL;
}

/*
* put one data to queue
*/
static void enqueue(queue_t* q, void* data)
{
	q->list->op->insert_to_tail(q->list, data);
}

/*
* get one data from queue and delete
*/
static void* dequeue(queue_t* q)
{
	if ( q->list->op->is_empty(q->list) )
		return NULL;

	node_t* node = q->list->op->get_head_node(q->list);
	q->list->op->delete_head_node(q->list);
	return node->data;
}

/*
* get one data from queue
*/
static void* peekqueue(queue_t* q)
{
	if ( q->list->op->is_empty(q->list) )
		return NULL;

	node_t* node = q->list->op->get_head_node(q->list);
	return node->data;
}

static int get_size(queue_t* q)
{
	return q->list->op->get_size(q->list);
}

static int is_empty(queue_t* q)
{
	return q->list->op->is_empty(q->list);
}

댓글