반응형
덱
# 리스트의 양쪽 끝 모두에서 입출력을 할 수 있는 자료구조이다.
# 큐와 스택의 개념을 일반화시킨 자료구조라고 할 수 있다.
# 연결 리스트나 배열 기반으로 만들 수 있는데 배열 기반으로 하면 원형큐의 형태로 만들어 중앙부분부터 채워넣는다.
# 덱이 비어있는 상태에서 데이터를 빼려고 하면 널포인터를 반환한다.
덱의 변형
# 한 쪽 끝에서의 삽입 작업에 제한을 둔 덱을 입력제한덱(Input restricted deque) 혹은 스크롤(Scroll)이라 한다.
# 구현은 앞부분에 삽입하는 것을 제한하는 형태로 만들었다.
# 한 쪽 끝에서의 제거 작업에 제한을 둔 덱을 출력제한덱(Output restricted deque) 혹은 셸프(Shelf)라고 한다.
# 구현은 뒷부분에서 제거하는 것을 제한하는 형태로 만들었다.
C++로 구현한 덱
#pragma once template <typename T> class Deque { template <typename T> struct node { T data; node<T>* prev; node<T>* next; }; node<T>* pFirst; node<T>* pLast; T tRet; int iSize; public: int getSize(); int AddFirst(T data); int AddLast(T data); T& RemoveFirst(); T& RemoveLast(); public: Deque(); ~Deque(); }; template <typename T> Deque<T>::Deque() { pFirst = nullptr; pLast = nullptr; iSize = 0; } template <typename T> int Deque<T>::getSize() { return iSize; } template <typename T> int Deque<T>::AddFirst(T data) { node<T>* newnode = new node<T>; newnode->data = data; newnode->prev = nullptr; newnode->next = pFirst; if (pLast == nullptr) { pLast = newnode; } else { pFirst->prev = newnode; } pFirst = newnode; return ++iSize; } template <typename T> int Deque<T>::AddLast(T data) { node<T>* newnode = new node<T>; newnode->data = data; newnode->prev = pLast; newnode->next = nullptr; if (pFirst == nullptr) { pFirst = newnode; } else { pLast->next = newnode; } pLast = newnode; return ++iSize; } template <typename T> T& Deque<T>::RemoveFirst() { node<T>* pDel = nullptr; pDel = pFirst; tRet = pDel->data; pFirst = pFirst->next; pFirst->prev = nullptr; delete pDel; iSize--; return tRet; } template <typename T> T& Deque<T>::RemoveLast() { node<T>* pDel = nullptr; pDel = pLast; tRet = pDel->data; pLast = pLast->prev; pLast->next = nullptr; delete pDel; iSize--; return tRet; } template <typename T> Deque<T>::~Deque() { node<T>* pDel = nullptr; node<T>* pFind = pFirst; while (pFind != nullptr) { pDel = pFind; pFind = pFind->next; delete pDel; } pFirst = nullptr; pLast = nullptr; iSize = 0; }
C++로 구현한 스크롤
#pragma once template <typename T> class Scroll { template <typename T> struct node { T data; node<T>* prev; node<T>* next; }; node<T>* pFirst; node<T>* pLast; T tRet; int iSize; public: int getSize(); int AddLast(T data); T& RemoveFirst(); T& RemoveLast(); public: Scroll(); ~Scroll(); }; template <typename T> Scroll<T>::Scroll() { pFirst = nullptr; pLast = nullptr; iSize = 0; } template <typename T> int Scroll<T>::getSize() { return iSize; } template <typename T> int Scroll<T>::AddLast(T data) { node<T>* newnode = new node<T>; newnode->data = data; newnode->prev = pLast; newnode->next = nullptr; if (pFirst == nullptr) { pFirst = newnode; } else { pLast->next = newnode; } pLast = newnode; return ++iSize; } template <typename T> T& Scroll<T>::RemoveFirst() { node<T>* pDel = nullptr; pDel = pFirst; tRet = pDel->data; pFirst = pFirst->next; pFirst->prev = nullptr; delete pDel; iSize--; return tRet; } template <typename T> T& Scroll<T>::RemoveLast() { node<T>* pDel = nullptr; pDel = pLast; tRet = pDel->data; pLast = pLast->prev; pLast->next = nullptr; delete pDel; iSize--; return tRet; } template <typename T> Scroll<T>::~Scroll() { node<T>* pDel = nullptr; node<T>* pFind = pFirst; while (pFind != nullptr) { pDel = pFind; pFind = pFind->next; delete pDel; } pFirst = nullptr; pLast = nullptr; iSize = 0; }
C++로 구현한 셸프
#pragma once template <typename T> class Shelf { template <typename T> struct node { T data; node<T>* prev; node<T>* next; }; node<T>* pFirst; node<T>* pLast; T tRet; int iSize; public: int getSize(); int AddFirst(T data); int AddLast(T data); T& RemoveFirst(); public: Shelf(); ~Shelf(); }; template <typename T> Shelf<T>::Shelf() { pFirst = nullptr; pLast = nullptr; iSize = 0; } template <typename T> int Shelf<T>::getSize() { return iSize; } template <typename T> int Shelf<T>::AddFirst(T data) { node<T>* newnode = new node<T>; newnode->data = data; newnode->prev = nullptr; newnode->next = pFirst; if (pLast == nullptr) { pLast = newnode; } else { pFirst->prev = newnode; } pFirst = newnode; return ++iSize; } template <typename T> int Shelf<T>::AddLast(T data) { node<T>* newnode = new node<T>; newnode->data = data; newnode->prev = pLast; newnode->next = nullptr; if (pFirst == nullptr) { pFirst = newnode; } else { pLast->next = newnode; } pLast = newnode; return ++iSize; } template <typename T> T& Shelf<T>::RemoveFirst() { node<T>* pDel = nullptr; pDel = pFirst; tRet = pDel->data; pFirst = pFirst->next; pFirst->prev = nullptr; delete pDel; iSize--; return tRet; } template <typename T> Shelf<T>::~Shelf() { node<T>* pDel = nullptr; node<T>* pFind = pFirst; while (pFind != nullptr) { pDel = pFind; pFind = pFind->next; delete pDel; } pFirst = nullptr; pLast = nullptr; iSize = 0; }
반응형