-
Deque자료구조와 알고리즘/자료구조 2023. 5. 14. 10:58
Deque(덱)은 양방향으로 데이터를 꺼내거나, 삽입 할 수 있는 자료구조를 의미한다.
구현
덱의 구현은 양방향연결리스트의 소스를 참고하여 활용하면 비교적 간단하게 만들 수 있다.
헤더
#ifndef _DQUE_H#define _DQUE_H
typedef int data;
typedef struct _node{data data;struct _node* next;struct _node* pre;}node;
typedef struct _Dque{node* head;node* tail;int size;}Dque;
typedef Dque Deque;
void DequeInit(Deque* pq1);int DQisEmpty(Deque* pq1);
void DQAddFirst(Deque* pq1,data data);void DQAddLast(Deque* pq1,data data);
data DQRemoveFirst(Deque* pq1);data DQRemoveLast(Deque* pq1);
data DQgetFirst(Deque* pq1);data DQfetLast(Deque* pq1);
#endif소스
#include "Deque.h"#include <stdio.h>#include <stdlib.h>
void DequeInit(Deque* pq1){pq1->head = NULL;pq1->tail = NULL;}int DQisEmpty(Deque* pq1){if(pq1 -> head =NULL) return 1;else return 0;}
void DQAddFirst(Deque* pq1,data data){node* newnode = (node*)malloc(sizeof(node));newnode->data = data;newnode -> next = pq1->head;if(DQisEmpty(pq1)){pq1->tail = newnode;}else{pq1->head->pre=newnode;}
newnode->pre = NULL;pq1->head = newnode;}void DQAddLast(Deque* pq1,data data){node* newnode = (node*)malloc(sizeof(node));newnode -> data = data;newnode->next = NULL;newnode -> pre = pq1->tail;if(DQisEmpty(pq1)){pq1->head = newnode;}else{pq1->tail->next = newnode;}newnode->next = NULL;pq1->tail = newnode;}
data DQRemoveFirst(Deque* pq1){if(DQisEmpty(pq1)){exit(-1);}node* renode = pq1->head;data Data = renode->data;
pq1->head = pq1->head->next;free(renode);if(pq1->head == NULL)pq1->tail == NULL;elsepq1->head->pre=NULL;
return Data;
}data DQRemoveLast(Deque* pq1){if(DQisEmpty){exit(-1);}node* renode = pq1->tail;data Data = renode->data;
pq1->tail = pq1->tail->pre;free(renode);
if(pq1->tail == NULL)pq1->head = NULL;elsepq1->tail->next=NULL;
return Data;}
data DQgetFirst(Deque* pq1){if(DQisEmpty){exit(-1);}return pq1->head->data;}data DQfetLast(Deque* pq1){if(DQisEmpty){exit(-1);}return pq1->head->data;}자바
class MyDequeue<T>{ private Node<T> head; private Node<T> tail; MyDequeue(){ head =null; tail = null; } boolean isEmpty(){ if(head == null) return true; return false; } void addFrount(T data){ Node<T> newnode = new Node<>(); newnode.data =data; newnode.next = head; newnode.pre = null; if(isEmpty()){ tail = newnode; }else head.pre = newnode; head = newnode; } void addLast(T data){ Node<T> newnode = new Node<>(); newnode.data = data; newnode.pre = tail; newnode.next = null; if(isEmpty()){ head = newnode; }else{ tail.next = newnode; } tail = newnode; } T removeFrount(){ if(isEmpty()){ System.out.print("빈큐"); System.exit(-1); } T redata = head.data; head = head.next; if(head == null) tail =null; else head.pre = null; return redata; } T removeLast(){ if(isEmpty()){ System.out.print("빈큐"); System.exit(-1); } T rdata = tail.data; tail = tail.pre; if(tail==null) head =null; else tail.next = null; return rdata; } T getFrount(){ if(isEmpty()){ System.out.print("빈큐"); System.exit(-1); } return head.data; } T getLast(){ if(isEmpty()){ System.out.print("빈큐"); System.exit(-1); } return tail.data; } private class Node<T>{ T data; Node<T> next; Node<T> pre; } }
참고자료: 윤성우 열혈자료구조
'자료구조와 알고리즘 > 자료구조' 카테고리의 다른 글
Tree - 이진 트리의 구현과 순회 (0) 2023.05.15 Tree - 트리와 이진트리란 (0) 2023.05.15 Queue - 원형 큐, 연결리스트 (0) 2023.05.13 스택의 활용 - 계산기 프로그램 (1) 2023.05.13 Stack - 배열,연결리스트,원형연결리스트 (0) 2023.05.04