devych

about everything

Stack

2019-02-17 devychdatastructure

스택(Stack)이란?

스택이란 선형 자료구조 중 한가지인데, 먼저 들어온 놈은 아래로 깔리고 나중에 들어온 놈은 위로 올라갑니다. 일상생활에서 사용하는 예로 짐을 쌓는것과 비슷하죠.

아래 그림을 보고 다시 설명할게요.

stack

위 그림이 스택을 표현한 것인데, 위에서 이야기했던 짐쌓는것과 어느정도 매치가 되나요?

위에 짐을 차례로 치우지 않으면 아래에 있는 짐은 치울수가 없는거죠. 이게 보드게임 ‘젠가’처럼 중간에 있는 애들을 뺄수있으면 좋은데 그건 안됩니다.

스택 자료 구조를 설명하려면 FILO(First In Last Out) 혹은 LIFO(Last In First Out) 라고 하는데 우리나라 말로 번역하자면 ‘후입선출’이라고 말할 수 있겠네요.

이제 자바스크립트(JavaScript)에서 스택(Stack)을 구현(Implementation)하기 위해서 의사코드(PseudoCode)를 만들어 볼까요.

새로운 프로토타입을 잡아서 특정 value를 순서대로 추가할 수 있도록 Push 메소드와 가장 마지막에 들어온 엘리먼트를 삭제할 수 있도록 Pop메소드를 만들거에요.

스택(Stack) JS 코드 구현

//먼저 Stack이라는 프로토타입을 추가해줍니다.
const Stack = function() {
  this.storage = {}; //스토리지라는 객체를 가지고 있고,
  this.count = 0; //카운트를 가지고 있습니다.
};

//그리고 push메소드를 생성해줍니다. Push를 하면 위에서 만든 '카운트'라는 키를 가지는 밸류가 스토리지에 할당되도록 합니다. 또 Push을 하면 count가 1씩 증가합니다.
Stack.prototype.push = function(value) {
  this.storage[this.count] = value;
  this.count++;
};
//Pop메소드를 생성해줍니다. Pop을 하면 Push를 하면서 올라갔던 'count'가 하나씩 줄어들면서 가장 마지막에 들어갔던 키를 지목하며 엘리먼트를 삭제해줍니다.
Stack.prototype.pop = function() {
  if (!this.count) {
    return undefined;
  }
  //근데 만약 storage에 아무것도 없으면 'undefined'를 리턴합니다.

  this.count--;
  delete this.storage[this.count];
};

어때요? 참 쉽죠?

다음번에는 두번째로 Queue를 다뤄보도록 합니다.