KAU/C++ 자료구조

Template을 사용해 Stack 구현하기

jeonyoungseo 2022. 6. 10. 14:57
Template을 쓰는 가장 강력한 이유는 바로 '어떠한 타입으로도 인스턴스화 가능'하다는 것이다.

인스턴스를 가장 잘 설명하는 예시는
Bag <int> a;
Bag <Rectangle> r;
우리는 Bag을 이용해 <int>형 객체뿐만 아니라 <rectangle>형 객체도 만들 수 있다!


PPT 템플릿 왜 갖다 쓰는지 생각해봐라
누군가가 템플릿으로 만들어주거나 만든 템플릿을 잘 활용할 수 있다면 나는 그저 선언하고 사용하는 것만으로도 설계 구조까지 통째로 가져다 재사용할 수 있다는 장점이 있다.

Template을 이용해 Stack 구현하기

스택은 언제나 목록의 끝에서만 일어난다!

코드에서 집중적으로 볼 것
Template이 어떻게 쓰였는가?
Push와 Pop에는 각각 ++, --연산자가 다르게(전위,후위) 쓰였음을 주의하자.

#include <iostream>
#include <algorithm>
#define SIZE 10
using namespace std;
template <typename T>
class Stack {
private:
	T* data ;
	int top;
	int capacity;

public:
	Stack(int size = SIZE) {
		data = new T[size];
		capacity = size;
		top = -1;
	};
	void changeSize1D(T *&a, const int oldSize, const int newSize) {
		if (newSize < 0) throw "New Length must be >=0";

		T* temp = new T[newSize];
		int number = min(oldSize, newSize);
		copy(a, a + number, temp);
		delete[] a;
		a = temp;
	}
	void Push(T x)
	{
		if (top == capacity - 1) {
			changeSize1D(data, capacity, 2 * capacity);
			capacity *= 2;
		}
		data[++top] = x;
	}
	void Pop() {
		if (IsEmpty()) throw "Stack is Empty. Cannot Delete";
		data[top--].~T();
	}
	bool IsEmpty() const { return top == -1; }
	void  Print() {
		for (int i = 0; i < top + 1; ++i)
			cout << data[i] << ' ';
	}
};

int main() {
	Stack<int> s;

	for (int i = 0; i < 5; i++) {
		int IN;
		cin >> IN;
		s.Push(IN);
		s.Print();
		cout << endl;
	}
	for (int i = 0; i <3; i++) {
		s.Pop();
		cout << "하나 없앱니다 POP!!";
		s.Print();
		cout << endl;
	}
	
}

시간이 없어서 너무 대충 input을 넣어버렸당.. input은 2 -> 4 -> 6 -> 8 -> 1 로 넣고 pop함수는 3번 실행시켰다.

 

다음은 공부하면서 들었던 의문에 대해 적어봤다. class에서 쓰이는 ::에 대한 설명이다.

Stack::Pop() {  ...  }; 
여기서 '::' 이 의미하는 건 뭐지??? 꼭 필요할까?? 
결론부터 말하면 클래스 메소드를 만들 때 쓰인다!

class 하나를 만들어보자.

class Stack{
private : ~~~
public : ~~~

    void Pop {
         난 이런 pop시키는 함수를 만들고 싶다.
    }
}

나는 Stack과 관련한 함수를 만들고 싶다.
이때 그냥 class안에 함수 정의를 해주면 void Pop(){ ~~ } 이렇게 해주면 되지만,
class 밖에 따로 할당해주고자 할 때는 Stack::Pop(){~~} 으로 써주어야 Stack의 함수임을 알 수 있다!
즉, :: 는 클래스 메소드를 위해 존재하는 것이다.