목록 전체보기 (198)
공부중
이번에 보일 자료는 큐(Queue)이다. 큐는 바로 먼저 들어간 것이 먼저 나오는 선입선출(先入先出), FIFO(First-In, First-Out) 구조의 자료구조 이다. 큐도 스택과 같이 우리 주변에서 많이 살펴볼 수 있다. 예를 들자면.. 이런 주사기가 있겠고. 이렇게 줄서기 등등 스택과 같이 큐도 그렇게 어렵지 않은 개념의 자료구조 이다. 간단하게 생각하기에는 "뭐 스택에서 조금만 바꿔주면 큐가 되겟네?" 라고 생각할 수 있다. 그럼 일단 큐의 배열 구현 모델을 살펴보자 큐에 데이터를 삽입할 때를 표현해본 것이다 여기서 F는 Front의 약자이고 R은 Rear의 약자로 F는 큐의 맨 앞 머리, R은 큐의 맨 뒤 꼬리를 가리키는 것이다. 그리고 삭제할 때를 살펴보자 이 그림에서 보이는 방식은 F가 ..
이번에 설명하고자 하는 자료는 스택(Stack)이다. 스택은 한 문장으로 표현하면 "먼저 들어간 것이 나중에 나온다." 위 문장대로 스택은 후입선출(後入先出)또는 LIFO(Last-In, First-Out)의 자료구조라고 불린다. 이러한 스택의 구조는 우리 주변에서 많이 살펴볼 수 있다. 이러한 프링글스라던가.. 이런 장난감 같은 경우도 스택구조이다. 먼저 배열기반으로 구현해보았다. Candy.h#pragma once enum eCandy { eRed = 1, eGreen, eBlack, }; class Candy { public: Candy(); ~Candy(); virtual void TasteCandy() = 0; virtual void SeeCandy() = 0; private: }; class ..
양방향 연결리스트 혹은 이중 연결 링크드 리스트 라고 불리는 이 자료구조는 이름 그대로 양방향성을 띄는 구조이다. 한가지 방향성을 가진 모습이 이러 하였다면.. 양방향 연결리스트는 이렇게 양방향성을 가지고 있다. 이렇게 양방향성을 가지면서 한방향성보다 더욱 편리하게 이용할 수 있다. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveData; Node *Prev; Node *Next; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
원형 연결리스트는 말 그대로 원형으로 구조가 되어있는 연결리스트이다. 예를 들자면 이러한 구조가 될 것 같다. 계속 끝없이 순환 하는 연결리스트이다.ss 앞에서 만들었던 연결리스트의 마지막 노드가 맨 앞의 노드를 가리키면 뱀이 꼬리를 물 듯 원형의 모양이 자연스레 나오게 된다. 나름 원형 리스트를 새로 짜본다고 만들어 본거지만 뭔가 찜찜함은 여전하다.. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; Node *Next; int nSaveData; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
이전 글에 이어서 이번에는 데이터 조회를 살펴보자. NodeManager.cpp - void CNodeManager::PrintNode() void CNodeManager::PrintNode() { if( NULL == Head ) { std::cout
앞 글에서 나온 소스를 설명 해보고자 한다. 먼저 앞의 소스코드에서 데이터를 담을 때 마다 동적으로 메모리를 잡아주고 필요 없을 시 삭제하고 하였다. 이것을 간단한 비유를 들어보자. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveNUM; Node *Next; };이 Node클래스를 화물 컨테이너에 비유를 해보자. 직접 그림을 그리긴 했지만 .. 기차가 맞으니 오해는 없길 바랍니다. 화물 컨테이너가 하나도 없을 때 기차의 모습은 이러할 것이다. 여기에 화물이 1개가 추가 되었을 때 이러한 모습일 것이다. 그리고 컨테이너 안에는 데이터가 들어가 있을 것이다. 또한 이 기차는..
앞 글에서 문제가 된 정적인 배열로는 필요로 하는 메모리 크기에 대해서 바로 바로 대처가 불가능했다. 그러한 문제 해결로 동적인 메모리 구성으로 된 소스를 보자 구조는 다음과 같다 소스코드 Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveNUM; Node *Next; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
앞 글 에서도 보았듯이 배열 기반의 리스트의 특징은 다음과 같다. 데이터의 참조가 쉽다 – 인덱스 값을 기준으로 어디든지 한번에 참조 가능 배열의 길이는 초기에 결정 되어야 한다. – 프로그램 실행 도중 크기 변경이 불가능 하다. 삭제의 과정에서 데이터의 이동 및 복사가 자주 일어난다 – 삭제하고 빈 곳을 없애기 위한 정렬 그리고 실수로 일어날 크나큰 문제는 다음 소스코드를 보자. main.cpp#include const int MAX_ARRAY = 5; int main() { int nTestArray[MAX_ARRAY] = {0}; static int nCount = 0; int nGetNUM = 0; std::cout