[자료구조] 스택(stack)
스택(Stack)이란
자료구조 중 하나로, 데이터가 들어가는 배열이라 생각하면 편하며
후입선출(LIFO: Last In First Out) 구조를 가진다. // 가장 최근에 들어온 데이터가 가장 먼저 나가는 구조
1. 스택의 기본 구조
스택은 현재 들어와 있는 데이터의 최상단을 가리키는 top과 각 데이터의 요소, 삽입-삭제(push-pop) 메소드를 가진다.

다음은 스택을 C++의 객체를 이용하여 간단히 구현한 것이다. ( 이때 스택의 요소는 정수형으로 하였다 )
#define MAX_STACK_SIZE 5
class Stack{
private:
int top;
int array[MAX_STACK_SIZE];
public:
Stack(){ top = -1; }
~Stack(){}
bool isEmpty(){ return top == -1; }
bool isFull(){ return top == MAX_STACK_SIZE -1; }
void push(int i){
if(!isFull()) array[++top] = i;
else return;
}
int pop(){
if(!isEmpty()){ return array[top--]; }
}
void display(){
for (int i = 0; i <= top; i++){
cout << array[i] << " ";
}
cout << endl;
}
};
Stack 객체 설명
- private으로 top(스택의 최상단 인덱스를 가리킴), array(스택의 데이터를 삽입하기 위한 방식)를 선언하였다.
- Stack(){} // 생성자 함수로 객체 생성 시 to을 -1로 초기화한다.
- bool isEmpty(){} // 스택이 비어있는 지 확인한다, 비어있으면 true를 반환한다.
- bool isFull(){} // 스택이 꽉 차 있는 지를 확인한다, 꽉 차 있을 경우 true를 반환한다.
- void push(int i){} // isFull을 확인하고 아닐 경우 top의 값을 1 더한 후 array에서 top번째 요소를 i로 지정한다.
- int pop(){} // isEmpty를 확인하고 아닐 경우 array에서 top번째 요소를 리턴하고, top의 값을 1 뺀다.
- void display(){} // 스택의 요소를 top의 크기까지 디스플레이한다.
2. main() 함수 예제
int main(){
Stack s; // 스택 s 선언
s.push(1); // 1 추가
s.push(2); // 2 추가
s.push(3); // 3 추가
s.push(4); // 4 추가
s.push(5); // 5 추가
s.push(6); // isFull이 true이기에 추가 x
cout <<s.pop() << endl; // 스택의 최상단 값이었던 5가 반환, 이후 top--
s.push(7); // 7 추가
s.display(); // 1 2 3 4 7
return 0;
}
3. output
5
1 2 3 4 7
정리,
스택은 후입선출 - 선입후출 구조를 가지는 자료구조
다양한 문제를 해결하기 위한 알고리즘에서 활용할 수 있다. - ex. 괄호 검사 알고리즘, BFS(깊이 우선 탐색) 알고리즘 etc…