//Queue.h #pragma once #include /* * 큐: 선입 선출(FIFO), 선착순 - 정말 다양한 방식으로 구현이 가능하다. - 리스트 기반의 구현 방식, 배열 기반의 구현 방식을 베이스로 - 양방향으로 추가 가능한 큐라던지, 배열 기반의 큐인데, 한정된 배열 공간을 재활용해가며 사용할 수 있는 써클 큐라던지로 사용이 가능하다. */ //노드는 스택에서 구현했던 방식과 동일하다. template class CQueueNode { template friend class CQueue; private: CQueueNode() : m_Next(nullptr) { } ~CQueueNode() { } private: Tm_Data; CQueueNode* m_Next; }; //큐는 스택보다 변수..
//StackArray.h //배열형 스택은 데이터를 삭제할 때 배열 안의 내용을 지울 필요 없이 인덱스만 변경하면 끝이다. //-> 삭제 속도가 리스트형 스택보다 빠르다. #pragma once template class CStackArray { public: CStackArray() { //현재 사용중인 배열 수 m_Size = 0; //최대 용량 m_Capacity = 4; //최대 용량에 맞게 배열 동적 할당 m_Array = new T[m_Capacity]; } ~CStackArray() { //배열 제거 delete[] m_Array; } private: T* m_Array; int m_Size; int m_Capacity; public: //꽉 찼는지 bool full() { return m..
//Stack.h #pragma once #include /* * FILO(선입 후출): 먼저 들어온 데이터가 나중에 나간다. -> 물건을 통에 차곡차곡 담는다고 생각하면 될듯. 꺼낼때는 당연히 맨 위의 물건부터 꺼내야 한다. 메모리의 스택도 비슷한 느낌이다. 메모리 전체가 통으로 있으면, 메모리의 뒤쪽 부분에 스택 영역을 할당한다. * 활용처 - 데이터 뒤집기: 그냥 스택에 데이터를 넣었다 빼면 데이터가 뒤집어지므로 - 길찾기 알고리즘 * 구현 방법 - 동적 배열 - 리스트: 싱글 링크드 리스트면 충분하다. 반대로 갈 이유가 전혀없음 -> 맨 마지막 데이터에서부터 순서대로 접근할것이므로 * 이런 것들을 구현할 줄 알아야 하는 이유 - 나중에 멀티스레드를 활용하는 단계에서는, C++의 경우 STL을 사용..
함수에 포인터 타입으로 인자를 주면 스택에 새 공간을 임시로 할당하여 인자 주소의 값을 복사해온다. -> 이 과정에서 시간이 추가로 소요된다. 하지만 레퍼런스 타입으로 받아오면 이런 과정 없이 참조만 해서 데이터를 활용하므로 시간이 단축된다. 앞에 const를 붙여놓는 이유는 const를 붙이면 인자로 들어온 값을 변경할 수 없게 되므로 실수로 인한 데이터 변조를 막을 수 있다. 함수의 뒤에도 const를 붙일 수 있다. 이럴 경우 함수에서 클래스 내부의 변수를 변경할 수 없게 된다. 또한 const 함수는 같은 const 함수만 호출할 수 있다.
정확한 명칭은 잘 모르겠지만, 배열이 꽉 차면 자동으로 크기의 2배만큼 확장시켜 주는 클래스를 구현함 //Array.h #pragma once #include template class CArray { public: CArray() { m_Capacity = 4; m_Size = 0; m_Array = new T[m_Capacity]; } ~CArray() { delete[]m_Array; } private: T* m_Array; intm_Size;// 배열에 추가된 개수 intm_Capacity;// 배열의 전체 개수 public: void push_back(const T& Data) { if (Full()) { // 2배 크기의 공간을 새로 만들어준다. m_Capacity *= 2; T* Array ..
#pragma once //경고메시지를 띄우기 위한 헤더 #include /* 자료구조 : 데이터를 관리하는 방법. * 완벽한 자료구조는 없다. 상황마다 적합하고 효율적인 자료구조가 다르다. 그것을 적재적소에 활용하는 것이 중요하다. * 대표적인 자료구조 = 배열, 리스트 일반적으로 이론에서 만드는 자료구조는 실용성이 없다. 특정 자료형만 저장할 수 있기 때문이다. 실전에서 사용하려면 어떤 자료형이던 저장할 수 있게 만드는 것이 중요하다. -> 직전에 오퍼레이터와 템플릿을 배운 이유. * 자료구조는 대부분 STL(Standard Template Library)에 저장되어 있어서, 편하게 가져다 쓸 수 있다. 물론 그 전에 원리를 알아야 하므로 직접 만들어 볼 예정이다. * 링크드리스트 : 데이터를 저장하..
* "고블린, 10, 10, 10, 10"이라는 문자열을 문자열 Name, 정수 Str, 정수 Dex, 정수 Int, 정수 Luk 다섯 개의 변수에 나눠서 저장해 보자 * 파일 입출력에 요긴하게 쓸 수 있을 것 같다. #include //sscanf 함수 에러 해제 #pragma warning(disable:4996) #define BUFFER_SIZE 128 int main() { //소스 문자열 생성 char* stringarr = new char[BUFFER_SIZE]; memset(stringarr, 0, BUFFER_SIZE); strcpy_s(stringarr, BUFFER_SIZE, "고블린, 10, 10, 10, 10"); //복사받을 문자열과 변수 생성 char* name = new ch..
* %[ ] = [ ] 안의 서식만 입력받겠다는 뜻. 다른 서식이 입력되면 더이상 입력을 받지 않는다. ex) %[12345]: 12345만 입력받겠다. %[1-9]: 1~9 사이의 숫자만 입력받겠다. %[abc]: abc만 입력받겠다. %[a-z]: a~z 사이의 알파벳만 입력받겠다. * ^를 사용하여 ^뒤의 문자열을 제외한 나머지만 입력받을 수도 있다. 한마디로 ^ 뒤의 문자가 나오면 입력이 종료된다. ex) %[^,]: ,가 나오면 입력 종료 %[^\n]: 개행이 나오면 입력 종료(개행 빼고 모두 입력받음.) scanf_s("%s", string, 64)에 "동해물과 백두산이"를 입력하면 "동해물과"만 출력된다. scanf_s("%[^\n]", string, 64)에 "동해물과 백두산이"를 입력하면..
헤더에서 include를 남발하다 보면 서로가 서로를 include하는 순환참조가 발생할 수 있다. classA.h에서는 #include classB classB.h에서는 #include classA 이렇게 되면 컴파일 시 문제가 발생할 수 있다. 하지만 각 클래스 별로 서로의 데이터가 필요한 상황이 있는데, 이 때 순환참조를 방지하는 방법으로 '전방선언'을 활용할 수 있다. 쉽게 생각하면, 'ClassA.h에는 ClassB라는 클래스가 존재한다'만 알려주고, 실제로 ClassB 안의 데이터를 사용하는 ClassA.cpp에서 include를 해 주면 순환 참조를 막을 수 있는 것이다. //ClassA.h //클래스B 전방선언 class ClassB; class ClassA { public: ClassA(..