강께르의 개발일지

[C++] 스택 구현 본문

연습

[C++] 스택 구현

강께르 2021. 6. 22. 23:43

1. 이것은 무엇인가?

- STL에서 제공하는 스택을 이해하기 위해 직접 구현해보았다.

 

2. 스택이란 무엇인가?

- 스택은 가장 먼저 들어온 데이터가 가장 늦게 나가는 방식을 사용하는 자료구조이다. 이 방식을 선입후출, First in Last out, FILO라고도 한다. 

- 이런 특성을 살리기 위해 top이라는 인덱스가 필요하다. 이는 현 스택에 데이터의 마지막 혹은 스택의 꼭대기가 어디에 있는지 알려주기 위함이다.

- 이 top을 통해 데이터를 맨 앞부터 차곡차곡 쌓고 맨 뒤부터 다시 빼는 방식을 구현할 수 있다.

 

3. 요구 사항

- 스택의 데이터 추가

- 스택의 데이터 제거

- 스택의 데이터 유무 확인

- 스택의 포화 상태 확인

- 스택의 모든 데이터 출력

 

4. 함수 설명

- 스택에 대한 아래 코드들은 고정 배열 기반으로 만들었다.

 4-1. empty()

bool empty()
{
	bool result = true;
	for (int i = 0; i < m_top; i++)
	{
		if (m_stackArr[i])
		{
			result = false;
			break;
		}
	}
	return result;
}

- 배열이 비었는지 확인하는 함수이다.

- 가장 처음 인덱스부터 데이터가 들어와있는 top까지 순차적으로 접근하는데

- 만약 배열에 값이 있다면 false를 반환하는 함수이다.

- 생각해보니 딱히 for문을 돌리지 않고 top 값이 0이면 그 배열에 데이터가 없을텐데 더 간단한 구현 문제였다.

 

 4-2. full() 

bool full()
{
	bool result = true;
	for (int i = 0; i < MAX_SIZE; i++)
	{
		if (m_stackArr[i] == NULL)
		{
			result = false;
			break;
		}
	}
	return result;
}

- 배열이 가득 찼는지 확인하는 함수이다.

- 최대 배열의 크기까지 반복문을 수행하는데 수행하는 중에 배열에 데이터가 없다면 false를 반환한다.

- 이것도 비슷한 의문이 들었다. 그냥 top값이 최대 배열 크기랑 같으면 배열이 가득 찬 것인데 더 간단한 문제였다.

 

 4-3. push(int)

void push(int num)
{
	if (MAX_SIZE > m_top)
	{
		m_top++;
		m_stackArr[m_top] = num;
	}
}

- 스택에 값을 넣는 함수이다.

- 만약 최대 배열 크기가 top의 값보다 작으면 값을 넣는 것이다.

- 저 조건문의 구문이 full()에 응용해 간단하게 구현할 수 있는 좋은 예시인 것 같다.

 

 4-4. pop()

int pop()
{
	int result;
	if (m_top != -1)
	{
		result = m_stackArr[m_top];
		m_stackArr[m_top] = NULL;
		m_top--;
	}
	else
	{
		result = 0;
	}
	return result;
}

- 스택에서 데이터를 꺼내는 함수이다.

- 만약 top 값이 -1이라면 값을 반환할 변수에 가장 맨 위의 데이터를 저장한다.

- 그리고 가장 맨 위의 데이터에 NULL을 대입하고 top을 하나 줄인다.

- top이 왜 -1이 아니면 일까? 인덱스의 가장 처음은 1이 아니고 0이기 때문에, 스택의 데이터가 아예 없는 상태는 0이 아니라 -1이기 때문에 이렇게 했다.

- 만약 아무것도 없다면 반환값 저장 변수에 0을 넣는다.

 

 4-5. print()

void print()
{
	cout << "stack print()" << endl;
	for (int i = 0; i < m_top + 1; ++i)
	{
		cout << m_stackArr[i] << " ";
	}
	cout << endl;
}

- 스택의 데이터 값을 출력하는 함수이다.

- 0부터 top까지 인덱스를 증가시켜 스택에 있는 모든 데이터를 출력한다.

 

4. 코드

#pragma once
#include"Header.h"

const int MAX_SIZE = 10;
class Stack
{
private:
	int m_stackArr[MAX_SIZE];
	int m_top;
public:
	Stack() : m_top(-1)
	{
		for (int i = 0; i < MAX_SIZE; i++)
		{
			m_stackArr[i] = NULL;
		}
	}

	void push(int num)
	{
		if (MAX_SIZE > m_top + 1)
		{
			m_top++;
			m_stackArr[m_top] = num;
		}
	}

	int pop()
	{
		int result;
		if (m_top != -1)
		{
			result = m_stackArr[m_top];
			m_stackArr[m_top] = NULL;
			m_top--;
		}
		else
		{
			result = 0;
		}
		return result;
	}

	int top()
	{
		return m_stackArr[m_top];
	}

	bool empty()
	{
		bool result = true;
		for (int i = 0; i < m_top; i++)
		{
			if (m_stackArr[i])
			{
				result = false;
				break;
			}
		}
		return result;
	}

	bool full()
	{
		bool result = true;
		for (int i = 0; i < MAX_SIZE; i++)
		{
			if (m_stackArr[i] == NULL)
			{
				result = false;
				break;
			}
		}
		return result;
	}

	void print()
	{
		cout << "stack print()" << endl;
		for (int i = 0; i < m_top + 1; ++i)
		{
			cout << m_stackArr[i] << " ";
		}
		cout << endl;
	}
};

'연습' 카테고리의 다른 글

[C++] 순환 큐, 원형 큐 구현  (0) 2021.06.23
[C++] 단방향 리스트 구현  (0) 2021.06.22
[C++] 상점 기능 구현  (1) 2021.06.22
[C++] 월남뽕 게임  (0) 2021.06.16
[C++] 몬스터와 1대3 턴제 전투 게임  (0) 2021.06.14