스택(stack)이란?

 

스택(Stack)이란?

  • 최근 프로그래머스 코딩테스트를 풀어보면서 스택/큐 태마에 문제를 풀다 문득, 스택에 대한 정의를 확실히 내릴 수 없었습니다.
  • 코드와 씨름하며, 프레임웍과 aws sdk들과 씨름하며 기능개발에 몰두하는 것도 좋지만 기본기를 다지고 싶었습니다.
  • 때문에 자료구조에 대해서 정리해봅니다.
  • 자료구조를 생각하면 대표적으로 떠오르는 스택(Stack)이란? 무엇일까요?

 

1. 스택의 개념 정리

  • 스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있습니다.
    • 자료를 넣는 것을 '밀어넣는다' 하여 푸쉬(push)라고 합니다.
    • 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 푸쉬한 자료부터 나오게 됩니다.
    • 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조(한국어로 후입선출)라고 합니다.
  • 쉽게 설명하면 스택은 바닥이 막힌 상자라고 보면 됩니다. 나중에 넣은 물건이 위에 있으므로 먼저 꺼낼 수 밖에 없습니다.

 

2. 스택의 구현

  • 위에서 설명한 것 처럼 스택은 후입선출 개념입니다. 배열을 이용하여 구현을 예로 들어보겠습니다.
  • 예제로 사용할 배열 array를 아래와 같이 만들어 줍니다. 
let array = new Array();

  • 자료를 밀어넣는 이벤트인 push를 사용하여 5개의 자료(값)을 차례대로 넣어줍니다.
array.push('m');
array.push('i');
array.push('n');
array.push('g');
array.push('y');
array.push('u');
  • m,i,n,g,y,u 순서대로 array라는 바닥이 막힌 상자에 차곡차곡 쌓이게 됩니다.
  • 이제 자료를 꺼내는 Pop을 사용해보면 후입 선출개념에 맞게 'm'이 먼저 나오는게 아니라 'u'부터 나오게 됩니다.
let pop = array.pop();

console.log(pop); // print :: u
  • 자료를 한개 꺼낸 array를 console에 찍어보면 u 다음으로 넣었던 y가 마지막으로 오게됩니다.
console.log(array);

// print :: ['m','i','n','g','y']
  • 후입선출, 이것이 스택 구현의 기초되는 사용법입니다.

 

3. 스택의 응용

  • 위에서 보신 것 처럼 구현이 너무 쉬운데 응용하기에 따라 무궁무진하게 프로그래밍에 사용할 수 있습니다.
  • 쉬운 예제로 웹사이트 뒤로가기 혹은 편집기의 control+z 기능도 가장 최근에 실행한 무언가를 취소한 후 마지막에 들어간 자료가 먼저 나오는 스택구조를 응용하여 개발되었습니다.
  • 또다른 예제로 재귀함수(자기 자신을 호출하여 사용하는 함수)도 스택을 기반으로 하고 있습니다.

 

 

function factorial(num) {
    if (num < 1) {
        return 1;
    }
    return num * factorial(num - 1);
}

console.log(factorial(5)); 
// print :: 120
  • 위 예제는 팩토리얼을 구하는 재귀함수 예제입니다. 함수가 자신의 안에서 자신을 호출합니다.
  • 풀이를 한다면 console.log(5)를 하였을 경우 아래와 같이 연산이 됩니다.
    1. 5는 1보다 큼으로 return 5 * factorial(4);
    2. 4는 1보다 큼으로 return 4 * factorial(3);
    3. 3은 1보다 큼으로 return 3 * factorial(2);
    4. 2는 1보다 큼으로 return 2 * factorial(1);
    5. 1은 1보다 작지않음으로 return 1 * factorial(0);
    6. 0은 1보다 작음으로 return 1;
  • 1번부터 6번까지가 실행된 이후 (마지막에 실행된 것 부터) 차례대로 아래와 같이 실행됩니다.
    1. 6의 리턴값이 5의 factorial(0)값이 되어 1*1
    2. 4의 factorial(1)의 값이 1이되어 factorial(2)는 return 2*1 = 2
    3. 2의 factorial(3)의 값은 return 3* 2 = 6
    4. 1의 factorial(4)의 값은 return 4*6 = 24
    5. 결국 console.log(factorial(5));의 facotrial(5)는 5*24 = 120이 됩니다.
  • 스택 구조와 마찬가지로 마지막에 들어갔던 것 부터 차례대로 사용되는 것을 확인할 수 있습니다.

 

마무리

  • 스택은 후입선출 특성을 가지는 자료구조를 일컫는 말입니다.
  • 스택은 바닥이 막힌 상자에 자료를 넣고 빼는 것을 생각하면 이해하기 쉽습니다.

'ETC > 자료구조' 카테고리의 다른 글

큐(Queue)란?  (0) 2022.03.18