Stack / Queue

1 minute read

스택 & 큐

스택 (stack)

스택은 선형구조로써 뜻 그대로 데이터를 쌓으면서 저장하는 방법입니다.

예로들어, 구슬통에 구슬(구슬통 지름과 구슬 지름은 비슷하다)을 넣고 빼는 동작들이 스택의 특징과 같다 할 수 있습니다. 구슬을 아래순서로 넣었을때, 빼는 순서는 역순이 됩니다. 이러한 특징으로 스택은 LIFO(Last In First Out), 후입선출 특징을 가집니다.

구슬을 넣을 때: 빨간 구슬 → 노란 구슬 → 파란 구슬 → 주황 구슬 → 초록 구슬

구슬을 뺄 때 : 초록 구슬 → 주황 구슬 → 파란 구슬 → 노란 구슬 → 빨간 구슬

예시

  • Undo/Redo Mechanism
  • Backwards/Forwards Mechanism of Browsers
  • Call Stack

빅오

스택의 추가 빅오는 O(1), 삭제 빅오는 O(1), 탐색의 빅오는 O(n)입니다.

스택 코드

  • JavaScript
    • 스택은 top 속성과 add, remove, contain 메소드를 가집니다.
      function Stack () {
        const stack = {};
        const storage = [];
    
        stack.top = null;
    
        stack.add = function (value) {
          storage.push(value);
          stack.top = value;
        }
    
        stack.remove = function () {
          if (storage.length === 0) {
            return;
          }
    
          storage.pop();
          stack.top = storage[storage.length - 1] === undefined
            ? null
            : storage[storage.length - 1];
        }
    
        stack.contain = function (value) {
          for (let i = 0; i < storage.length; i++) {
            if (storage[i] === value) {
              return true;
            }
          }
    
          return false;
        }
    
        return stack;
      }
    

큐 (queue)

큐 또한 선형구조로써 뜻 그대로 데이터를 줄세우며 저장하는 방법입니다.

예로들어, 파이프에 구슬(구슬통 지름과 구슬 지름은 비슷하다)을 넣고 빼는 동작들이 스택의 특징과 같다 할 수 있습니다. 구슬을 아래순서로 넣었을때, 빼는 순서는 순서대로 됩니다. 이러한 특징으로 스택은 FIFO(First In First Out), 선입선출 특징을 가집니다.

구슬을 넣을 때: 빨간 구슬 → 노란 구슬 → 파란 구슬 → 주황 구슬 → 초록 구슬

구슬을 뺄 때 : 빨간 구슬 → 노란 구슬 → 파란 구슬 → 주황 구슬 → 초록 구슬

예시

  • Line of people standing for food
  • Callback queue

빅오

스택의 추가 빅오는 O(1), 삭제 빅오는 O(1), 탐색의 빅오는 O(n)입니다.

큐 코드

  • JavaScript
    • 큐는 bottom 속성과 add, remove, contain 메소드를 가집니다.
      function Queue () {
        const queue = {};
        const storage = [];
    
        queue.bottom = null;
    
        queue.add = function (value) {
          storage.unshift(value);
          queue.bottom = storage[storage.length - 1];
        }
    
        queue.remove = function () {
          storage.pop();
          queue.bottom = storage[storage.length - 1] === undefined
            ? null
            : storage[storage.length - 1];
        }
    
        queue.contain = function (value) {
          for (let i = 0; i < storage.length; i++) {
            if (storage[i] === value) {
              return true;
            }
          }
    
          return false;
        }
    
        return queue;
      }
    

Updated: