http://www.cplusplus.com/reference/stack/stack/

이 포스팅은 위 자료를 참고로 작성되었다.


1. Stack 자료형

 - LIFO 자료형으로 나중에 들어온 자료가 가장 먼저 나온다.

 - 배열에서 한 쪽이 막힌 구조로 한 쪽으로 자료를 넣고 한 쪽으로 자료를 꺼내는 모양으로 생각하면 된다.


2. Include

 - #include <stack>


3. 선언 방법

    stack<T> a(5);

 - T에 자료형(클래스)를 넣어서 해당 자료를 저장하는 stack을 만들 수 있다.

 - 해당 선언문으로 만들어진다.(따로 new로 자료형을 만들어줄 필요는 없다.)

 - 괄호 속에 다양한 자료를 넣어 초기 값을 설정해 줄 수 있다.(숫자인 경우 stack의 크기)


4. 주요 function

 stack<int> testStack;

 1) testStack.empty();

  - 현재 Stack이 비어있는지 여부를 반환(true - 비어있음)

 2) testStack.size()

  - 현재 Stack에 Push된 Object 수를 반환

 3) testStack.top()

  - Stack에서 가장 나중에 Push된 Object를 반환한다.

  - Object의 내용만 반환하고 해당 오브젝트는 계속 Stack에 남아있다.

 4) testStack.push(1)

  - Stack에 새로운 Object를 삽입.(위 에선 1을 stack에 삽입, class Object도 가능)

 5) testStack.pop()

  - Stack에서 가장 나중에 입력된 Object를 Stack에서 버린다.(반환값은 없다)

 6) testStack.emplace(args)

  - 기본 자료형이 아닌 특정 클래스의 Stack이라면 해당 args를 그 클래스의 생성자로 넘겨 해당 클래스의 객체를 생성해서 Stack에 Push

 7) testStack.swap(anotherStack)

  - 두 Stack의 내용을 서로 바꿈.


5. 예제

#include <iostream>
#include <stack>

using namespace std;

// 명령 클래스
class Instruction
{
	//명령 번호
	int number;
	//명령 내용
	int content;

public:
	//명령 기본 생성자
	Instruction()
	{
		number = 0;
		content = 0;
	}

	//명령 생성자(각 변수에 값 삽입)
	Instruction(int num, int con)
	{
		number = num;
		content = con;
	}

	//명령 번호 반환
	int getNumber()
	{
		return number;
	}

	//명령 내용 반환
	int getContent()
	{
		return content;
	}
};

// canvas 출력
void printCanvas(int* can)
{
	for (int i = 0; i < 3; i++)
	{
		cout << can[i] << " ";
	}

	cout << endl;
}

int main()
{
	// canvas 초기화
	int canvas[3] = { 0, };

	// 되돌리기 명령 저장
	stack<instruction> undoStack;

	// 첫번쨰 지우는 명령
	Instruction eraseFirst(1, 1);
	Instruction drawFirst(0, 1);
	
	cout << "초기 상태     : ";
	printCanvas(canvas);

	// 그리기 명령
	canvas[1] = 1;
	undoStack.push(drawFirst);

	cout << "그리기 명령 1 : ";
	printCanvas(canvas);

	// 지우기 명령
	canvas[1] = 0;
	undoStack.push(eraseFirst);

	cout << "지우기 명령 1 : ";
	printCanvas(canvas);

	//그리기 명령
	canvas[2] = 1;
	undoStack.emplace(0, 2);

	cout << "그리기 명령 2 : ";
	printCanvas(canvas);

	//전부다 되돌리기
	while (!undoStack.empty())
	{
		// 명령마다 되돌리는 작업
		switch (undoStack.top().getNumber())
		{
		//그리기 되돌리기
		case 0:
			canvas[undoStack.top().getContent()] = 0;
			break;
		//지우기 되돌리기
		case 1:
			canvas[undoStack.top().getContent()] = 1;
			break;
		}

		//이미 되돌린 명령어는 삭제
		undoStack.pop();

		cout << "되돌리기      : ";
		printCanvas(canvas);
	}

	return 0;
}


6. 예제 결과

초기 상태            : 0 0 0

그리기 명령 1    : 0 1 0

지우기 명령 1    : 0 0 0

그리기 명령 2    : 0 0 1

되돌리기             : 0 0 0

되돌리기             : 0 1 0

되돌리기             : 0 0 0

+ Recent posts