다디와 괴발개발

C++로 스택 (Stack) 구현해보기 본문

알고리즘/C&C++

C++로 스택 (Stack) 구현해보기

아임다디 2021. 8. 17. 15:42

스택(Stack) 이란? 입출력이 한 곳으로 제한 되어있는 형태의 자료구조.

LIFO (Last in First OUT, 후입 선출)로, 가장 마지막에 들어간 데이터가 가장 먼저 나온다.

스택 구조 (출처 : 위키백과)

스택에서 가장 중요한 요소는 스택의 현재 위치를 가리키는 '스택 포인터(SP)' 라고 할 수 있다.

스택 포인터를 통해 스택이 비어있는지, 가득찼는지, 다음 값이 들어갈 위치 밑 삭제되어야 할 위치를 알 수 있다.

스택을 처음 설계할 때, 기본 위치는 -1로 설정한다.


C++로 스택을 구현하기 위해 제작한 함수

1. s.push() : 스택의 가장 top 부분에 데이터를 넣기 위한 함수

 구현하고자 하는 스택의 길이가 10이므로 스택에 10개의 데이터가 들어가면 더 이상 삽입이 불가능하도록 구현해야한다.

2. s.pop() : 스택의 가장 최신 데이터를 삭제하기 위한 함수

 스택이 비어있는 경우 더이상 삭제를 하지 않고 스택이 비어있다는 알림을 출력하도록 한다.

3. s.print() : 스택 전체를 출력하는 함수

 스택이 비어있는 경우 스택이 비어있다는 알림을 출력하도록 한다. 그렇지 않으면 스택에 들어있는 모든 데이터를 출력한다.


연습문제 : 길이가 10인 배열로 스택을 구현해보자

#include <iostream>

using namespace std;

class myStack {
private:
	int arr[10] = { 0 }; //stack의 총 크기를 10으로 둠
	int top = -1; // 위치를 기억하기 위한 스택 포인터(SP)

public:
	void push();
	void pop();
	void print();
};

void myStack::push() {
	if(top < 9){
		int num;
		cout << "숫자를 입력하세요 : ";
		cin >> num;
		top++;
		arr[top] = num;
	}
	else {
		cout << "stack is full" << endl;
	}
}

void myStack::pop() {
	if (top == -1) {
		cout << "stack is empty" << endl;
	}
	else {
		arr[top] = 0;
		top--;
	}
}

void myStack::print() {
	if (top == -1) {
		cout << "stack is empty" << endl;
	}
	else {
		for (int i = 0; i <= top; i++) {
			cout << i << " : " << arr[i] << endl;
		}
	}
}

int main() {
	myStack ms;
	int inp;

	while (1) {
		cout << "번호를 입력하시오 1. push / 2. pop / 3. print / 4. 종료 " << endl;
		cin >> inp;
		switch (inp) {
		case 1:
			ms.push();
			break;
		case 2:
			ms.pop();
			break;
		case 3:
			ms.print();
			break;
		case 4:
			return 0;
		default:
			cout << "잘못된 입력입니다" << endl;
		}
	}
	return 0;
}

 

++ 추가로 코드를 좀 더 줄이기 위해서는

데이터를 푸시할 때 arr[++top] = num; 으로 줄일 수 있다.

'알고리즘 > C&C++' 카테고리의 다른 글

[BOJ] 2606번 바이러스 - C++  (0) 2022.03.13
백준 1152 : 단어의 개수 (C++ 문자열 분리)  (0) 2021.10.06
C++로 Circular Queue (원형 큐) 구현하기  (0) 2021.08.18
백준 1546번: 평균  (0) 2021.08.12
백준 2588번: 곱셈  (0) 2021.07.28