//StackArray.h
//배열형 스택은 데이터를 삭제할 때 배열 안의 내용을 지울 필요 없이 인덱스만 변경하면 끝이다.
//-> 삭제 속도가 리스트형 스택보다 빠르다.
#pragma once
template <typename T>
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_Size == m_Capacity;
}
bool empty() const
{
return m_Size == 0;
}
int size() const
{
return m_Size;
}
int capacity() const
{
return m_Capacity;
}
void push(const T& Data)
{
//용량이 꽉 찼다면
if (full())
{
//최대 용량 변수를 늘려주고
m_Capacity *= 2;
//새로운 배열을 생성 후 임시 변수에 저장
T* NewArr = new T[m_Capacity];
//데이터를 복사
for (int i = 0; i < m_Size; ++i)
{
NewArr[i] = m_Array[i];
}
//복사가 끝났으면 기존 배열 할당 해제
delete[] m_Array;
//m_Array에 새 배열의 주소 등록
m_Array = NewArr;
}
//데이터 추가
m_Array[m_Size] = Data;
++m_Size;
}
T& Top()
{
if (empty())
{
assert(false);
}
return m_Array[m_Size - 1];
}
void pop()
{
if (empty())
{
assert(false);
}
//데이터를 삭제할 필요 없이 그냥 size를 하나 줄여주면 그게 마지막 주소가 된다.
--m_Size;
}
};
//main.cpp
#include <iostream>
#include "StackArray.h"
int main()
{
std::cout << "\n====== 배열형 스택 확인 =====" << std::endl;
CStackArray<int> stackArr;
for (int i = 0; i < 10; ++i)
{
stackArr.push(i);
}
while (!stackArr.empty())
{
std::cout << stackArr.Top() << std::endl;
stackArr.pop();
}
std::cout << "남은 Size: " << stackArr.size() << std::endl;
return 0;
}
'C++기초' 카테고리의 다른 글
220413_자료구조_배열형 큐(써클 큐, Circle Queue) 구현 및 실행 (0) | 2022.04.18 |
---|---|
220413_자료구조_리스트형 큐 구현 및 실행 (0) | 2022.04.18 |
220412_자료구조_리스트형 스택(Stack) 구현 및 실행 (0) | 2022.04.18 |
220407~220411_자료구조_링크드 리스트 실행 (Linked List) (0) | 2022.04.18 |
220407~220411_자료구조_링크드 리스트 구현 (Linked List) (0) | 2022.04.18 |