생성자와 소멸자는 이전에 포스팅한 벡터와 동일합니다.
PushBack()
스택은 당연히 뒤에 값을 추가하는건데 굳이 Back이라는 단어를 사용한 이유는 명확성 때문에 사용했습니다.
//마지막 위치에 원소를 추가합니다
void PushBack(const Data& data)
{
//컨테이너에 비어있는 자리가 있는지 확인
if (this->my_size == this->my_capacity)
{
//빈자리 없음. 재할당을 시도합니다
this->Reserve(this->my_capacity + this->additive_capacity);
}
//추가합니다
this->my_base[this->my_size++] = data;
}
1. 스택에 빈자리 체크
2. 추가
Reserve()에 대해선 여기를 봐주세요
https://forestbird0.tistory.com/38
[C++] 나만의 Vector만들기 (2) - 생성자, 소멸자, 캐퍼시티, Reserve
생성자와 소멸자 코드 MyVector() { //my_base가 nullptr지만 //사이즈및 캐퍼시티가 0이므로 원소를 추가할때 Reserve()함수에서 할당이 이뤄집니다 this->my_base = nullptr; this->my_capacity = this->my_size = 0; } MyVecto
forestbird0.tistory.com
스택도 벡터처럼 내부적으로 '동적 배열'을 사용하기 때문에 벡터와 크게 차이가 없습니다. 구현이 더 쉬운편에 속하죠.
언제든 마지막 위치에 원소를 추가하기 때문에 순서가 꼬이는 걱정도 하지 않아도 됩니다.
PopBack()
Top()
Data& PopBack()
{
this->CheckValidIndex(this->my_size - 1);
return this->my_base[this->my_size-- - 1];
}
Data& Top()
{
this->CheckValidIndex(this->my_size - 1);
return this->my_base[this->my_size - 1];
}
정말 간단하죠?
1. 인덱스 유효성 검사
2. 값 반환.
그저 둘 함수의 차이가 있다면, PopBack()은 반환하면서 원소를 삭제합니다. 삭제라고 표현했지만 원소자체가 삭제되지는 않고, 스택 원소개수 카운팅을 1개 줄입니다. 그러면 다음에 PushBack()으로 원소를 채우면 기존 원소값을 덮어씌워버리게 됩니다.
Top()은 마지막 원소를 반환만 할 뿐 삭제하진 않습니다.
스택 구현은 어렵지 않습니다. 구현자체에 목적을 두지 말고
내부적으로 '동적 배열'이 어떻게 활용되는지를 봐야 합니다.
https://github.com/ForestBird1/MyContainer
GitHub - ForestBird1/MyContainer
Contribute to ForestBird1/MyContainer development by creating an account on GitHub.
github.com
'C++ 자료구조' 카테고리의 다른 글
[C++] 나만의 Queue만들기 (1) - 동적 배열을 이용해서 구현 (0) | 2023.08.27 |
---|---|
[C++] 나만의 Queue만들기 (0) - 기초 (0) | 2023.08.27 |
[C++] 나만의 Stack만들기 (1) - 기초설명 (0) | 2023.08.25 |
[C++] 나만의 Vector만들기 (4) - 이터레이터(iterator), operator (0) | 2023.08.25 |
[C++] 나만의 Vector만들기 (3) - 원소 삽입, 삭제 (0) | 2023.08.25 |