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