프로그래밍/C,C++

[C++] 동적 배열을 이용한 stack

MAKGA 2021. 6. 30. 23:17
320x100
#pragma once
#include <iostream>
#include <memory>

template<typename T>
class cst_stack
{
public:
	cst_stack() {}
	virtual ~cst_stack() {}

	virtual void push(T& val) = 0;
	virtual void push(T&& val) = 0;
	virtual T& pop() = 0;
	virtual T& top() = 0;
	virtual bool IsEmpty() = 0;
	virtual bool IsFull() = 0;
};

template<typename T, size_t size = 128>
class cst_arr_stack : public cst_stack<T>
{
public:
	cst_arr_stack() noexcept
		:arr(new T[size]), top_(0), max_(size)
	{
	}
	~cst_arr_stack()
	{
		delete[] arr;
	}

	void push(T& val) override
	{
		if (max_ == top_) {
			realloc();
		}

		arr[top_++] = val;
	}
	void push(T&& val) override
	{
		if (max_ == top_) {
			realloc();
		}

		arr[top_++] = std::move(val);
	}
	T& pop() override
	{
		return arr[--top_];
	}

	T& top() override
	{
		return arr[top_ - 1];
	}

	bool IsEmpty() override
	{
		return top_ == 0 ? true : false;
	}
	bool IsFull() override
	{
		return top_ == max_ ? true : false;
	}

	void realloc() noexcept
	{
		max_ = max_ << 1;
		T* newarr = new T[max_];
		std::fill(newarr, newarr + max_, 0);
		for (int i = 0; i < (max_ >> 1); ++i) {
			newarr[i] = std::move(arr[i]);
		}
		delete arr;
		arr = newarr;
	}

	void print()
	{
		for (int i = 0; i < max_; ++i) {
			std::cout << arr[i] << std::endl;
		}
	}
private:
	T* arr;
	size_t top_;
	size_t max_;
};

기초부터 다시 시작해보는

커스텀 동적 배열 메모리 스택

320x100

'프로그래밍 > C,C++' 카테고리의 다른 글

enum 크기  (0) 2021.10.06
자주 사용하는 함수  (0) 2021.07.30
[C++] Object pool  (0) 2021.06.29
RTTI란?  (0) 2021.06.18
비동기 함수 정리  (0) 2021.03.22