Computer Science/Data Structure
[실전 알고리즘] 스택
do_hyuk
2024. 1. 10. 13:48
1. 정의와 성질
자료구조에서의 스택은 한쪽 끝에서 원소를 넣거나 뺄 수 있는 자료 구조이다.
스택은 구조적으로 먼저 들어간 원소가 제일 마지막에 나오는데, 이런 의미로 FILO(First In Last Out) 자료구조라고 부르기도 한다.
참고로 큐나 덱도 스택처럼 특정 위치에서만 원소를 넣거나 뺄 수 있는 제한이 걸려있다.
스택의 성질
- 원소의 추가가 O(1)
- 원소의 제거가 O(1)
- 제일 상단의 원소 확인 O(1)
- 제일 상단이 아닌 나머지 원소들의 확인/변경이 원칙적으로 불가능
스택에서는 제일 상단이 아닌 나머지 원소들의 확인/변경 기능이 제공되지 않는다. STL stack에서도 이 기능은 없다.
2. 기능과 구현
const int MX = 1000005;
int dat[MX];
int pos = 0;
스택은 배열 혹은 연결 리스트를 이용해서 구현할 수 있다. 그리고 둘 중에서 배열을 이용하는게 구현이 더 쉽다.
스택을 배열로 구현할 때에는 단지 원소를 담은 큰 배열 한 개와 인덱스를 저장할 변수 한 개만 필요하다.
이들이 실제 스택에 어떻게 대응되는 방식을 확인해보면 다음과 같다.
{13,21,30}이 담겨있는 스택을 나타내기 위해 dat[0], dat[1], dat[2] 각각에 13, 21, 30 썻고 pos는 3이란느 값을 가진다.
이와 같이 스택의 값들은 dat의 0번지부터 저장되고 pos는 다음에 원소가 추가될 때 삽입해야하는 곳을 가리키고 있다.
그리고 잘 생각해보면 pos의 값이 스택의 길이, 즉 스택 내의 원소의 수를 의미한다는 것을 알 수 있다.
구현
push 함수
void push(int x){
dat[pos++] = x;
}
pop 함수
void pop(){
pos--;
}
top 함수
int top(){
return dat[pos-1];
}
스택부터는 본격적으로 활용할 수 있는 방법이 굉장히 많아진다. 대표적인 사례로 수식의 괄호 쌍이랑 전위/중위/후위 표기법, DFS, Flood Fill 등이 있다.