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