Problem Solving에서는 자주 사용되는 자료 구조가 있다.
자료 구조에는 형태
와 규칙
으로 나뉘어진다.
형태
- 배열
- 링크드리스트
- 트리(이진트리 / 힙트리)
- 그래프
규칙
- 스택 / 큐
- Priority Queue
- Hash Table
- Union-Find
자료구조란 어떻게 저장하는지에 따라 달라지게 되는데, 우선 자료구조 규칙 중 기본적인 스택
과 큐
에 대해 간단히 알아보자.
스택
은 데이터 추가/읽기/지우기 모두 윗부분
에서 가능하다는 특징이 있다.
큐
는 데이터 읽기/지우기는 앞부분
에서 가능하고 추가는 뒷부분
에서 가능하다는 특징이 있다.
다음과 같은 규칙들은 중간에 존재하는 데이터를 읽을 수가 없고, 중간에 자료를 추가 혹은 삭제할수 없다는 특징들을 공통적으로 가지고있다.
다음으로, 자료구조 형태 중 링크드리스트
와 그래프
에 대해 간단히 알아보자.
링크드리스트
는 중간
에 노드(자료를 저장하는 최소단위)를 추가 및 삭제가 가능케 하는 형태이다.
그래프
는 값 뿐 만 아니라 데이터와 데이터 간의 관계 또한 저장가능한 형태이다.
간단한 이론들을 알아봤으면, PS에서는 스택을 어떻게 사용할 수 있는지 알아보겠습니다.
PS에서의 스택은 보통 라이브러리(Lib)
를 추가하여 사용하지만, 어떻게 동작되는지를 알아보기 위해서는 라이브러리 사용없이 코드를 우선 작성해보겠습니다.
라이브러리 없이 스택
#include <iostream>
using namespace std;
// 자료구조 범위 지정
int stack[10];
int node = 0;
// 데이터 저장/삭제/읽기 함수 작성
void push(int a) {
stack[node++] = a;
}
void pop() {
stack[--node] = 0;
}
int top() {
return stack[node - 1];
}
int main() {
push(1); // 1
push(2); // 1 2
push(3); // 1 2 3
push(5); // 1 2 3 5
push(7); // 1 2 3 5 7
cout << top(); // 7
pop(); // 7 삭제
cout << top(); // 5
pop(); // 5 삭제
push(4); // 1 2 3 4
cout << top(); // 4
return 0;
}
출력
Stack Lib를 이용하여 동일한 값을 출력해보겠습니다.
stack Lib 사용 코드
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> stack;
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(5);
stack.push(7);
cout << stack.top();
stack.pop();
cout << stack.top();
stack.pop();
stack.push(4);
cout << stack.top();
return 0;
}