둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (225)
    • 프로그래머스 (1)
      • 해시 (1)
    • BOJ (176)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (31)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (14)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
      • 누적합 (5)
      • 유니온 파인드 (1)
      • 분할 정복 (2)
    • 자료구조 (15)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (2)
      • 힙 (1)
      • 정렬 (1)
    • C++ (11)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (6)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • STL C++
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

자료구조/덱

덱 (연결리스트로 구현)

2022. 1. 6. 14:58

덱의 기본 설명은 '덱 (구조체로 구현)'에서 설명을 했으므로 생략하겠다. 백준 10866번 문제를 베이스로 구현한 코드다. 코드 자체는 이중 연결리스트와 유사하다. 또한, 연결리스트로 구현했으므로 full() 함수는 없다.

덱 직접 입력 코드 구현

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

typedef struct Node {
	int data;
	struct Node *left;
	struct Node *right;
}Node;

typedef struct Deque {
	Node *front;
	Node *rear;
	int size;
}Deque;

void init_deque(Deque *deque)
{
	deque->front = NULL;
	deque->rear = NULL;
	deque->size = 0;
}

int empty(Deque *deque)
{
	return deque->size == 0 ;
}

int size(Deque *deque) 
{
	return deque->size;
}

int front(Deque *deque)
{
    if(empty(deque))
    	return -1;
    return deque->front->data;
}

int back(Deque *deque)
{
    int re = -1;
    if(empty(deque))
	    return re;

    re = deque->rear->data;
    return re;
}

void push_front(Deque *deque, int data)
{
	Node *now = (Node *)malloc(sizeof(Node));
	now->data = data;
	if(empty(deque)) 
	{
		deque->front = now;
		deque->rear = now;
		now->right = NULL;
		now->left = NULL;
	} 
	else 
	{
		deque->front->left = now;
		now->right = deque->front;
		now->left = NULL;
		deque->front = now;
	}
	deque->size++;
}

void push_back(Deque *deque, int data)
{
	Node *now = (Node *)malloc(sizeof(Node));
	now->data = data;
	if(empty(deque)) 
	{
		deque->front = now;
		deque->rear = now;
		now->right = NULL;
    	now->left = NULL;
	} 
	else 
	{
    	deque->rear->right = now;
    	now->left = deque->rear;
		now->right = NULL;
		deque->rear = now;
	}
	deque->size++;
}

int pop_front(Deque *deque)
{
    int re = -1;
    Node *now;
    if(empty(deque))
    	return re;
		
    now = deque->front;
    re = now->data;
    deque->front = now->right;
    free(now);
    deque->size--;
    return re;
}

int pop_back(Deque *deque)
{
    int re = -1;
    Node *now;
    if(empty(deque))
    	return re;
	
    now = deque->rear;
    re = now->data;
    deque->rear = now->left;
    free(now);
    deque->size--;
    return re;
}

int main(void) 
{
	Deque* deque=(Deque*)malloc(sizeof(Deque));
	init_deque(deque);
	char Get_Com[11];
	int N,num;
	scanf("%d",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%s",Get_Com);
		if(strcmp(Get_Com,"push_front")==0)
		{
			scanf("%d",&num);
			push_front(deque,num);
		}
		else if(strcmp(Get_Com,"push_back")==0)
		{
			scanf("%d",&num);
			push_back(deque,num);
		}
		else if(strcmp(Get_Com,"front")==0)
			printf("%d\n",front(deque));
		else if(strcmp(Get_Com,"back")==0)
			printf("%d\n",back(deque));
		else if(strcmp(Get_Com,"empty")==0)
			printf("%d\n",empty(deque));
		else if(strcmp(Get_Com,"size")==0)
			printf("%d\n",size(deque));
		else if(strcmp(Get_Com,"pop_front")==0)
			printf("%d\n",pop_front(deque));
		else if(strcmp(Get_Com,"pop_back")==0)
			printf("%d\n",pop_back(deque));
	}
	return 0;
}

 

추가 설명

push_front() 함수와 push_back() 함수를 좀 더 짧게 줄일 수 있다. 위 코드와 동일한 코드이지만 위의 코드는 가독성을 좀 더 높인 코드고, 밑의 코드들은 코드 길이를 줄이기 위한 코드다.

void push_front(Deque *deque, int data)
{
	Node *now = (Node *)malloc(sizeof(Node));
	now->data = data;
	now->left = NULL;
	if(empty(deque)) 
	{
		deque->rear = now;
		now->right = NULL;
	} 
	else 
	{
		deque->front->left = now;
		now->right = deque->front;
	}
	deque->front = now;
	deque->size++;
}
void push_back(Deque *deque, int data)
{
	Node *now = (Node *)malloc(sizeof(Node));
	now->data = data;
	now->right = NULL;
	if(empty(deque)) 
	{
		deque->front = now;
		now->left = NULL;
	} 
	else 
	{
		deque->rear->right = now;
		now->left = deque->rear;
	}
	deque->rear = now;
	deque->size++;
}
저작자표시 (새창열림)

'자료구조 > 덱' 카테고리의 다른 글

덱 (구조체로 구현)  (0) 2022.01.06
    '자료구조/덱' 카테고리의 다른 글
    • 덱 (구조체로 구현)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바