Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트 스택(Stack) 자료구조 완벽 정리: 개념부터 구현까지

스택(Stack)이란?

스택은 대부분의 프로그래밍 언어에서 널리 활용되는 추상 자료형(Abstract Data Type, ADT)입니다. 이름 그대로 실제 세계의 '쌓아 올린 물건'처럼 동작하는데, 카드 한 벌이나 접시 더미를 떠올리면 쉽게 이해할 수 있습니다. 새 접시는 항상 맨 위에 올리고, 꺼낼 때도 맨 위에서부터 꺼내는 방식입니다.

자바스크립트 스택(Stack) 자료구조 완벽 정리: 개념부터 구현까지

LIFO(후입선출) 구조

스택은 한쪽 끝(top)에서만 삽입과 삭제가 이루어집니다. 이러한 특성 때문에 스택은 LIFO(Last-In-First-Out, 후입선출) 자료구조로 분류됩니다. 즉, 가장 나중에 삽입된 요소가 가장 먼저 꺼내집니다.

  • PUSH(푸시): 스택의 맨 위에 요소를 삽입하는 연산
  • POP(팝): 스택의 맨 위에서 요소를 제거하는 연산

다음 다이어그램은 스택에서 일어나는 연산 과정을 보여줍니다.

자바스크립트 스택(Stack) 자료구조 완벽 정리: 개념부터 구현까지

자바스크립트로 구현하는 스택 클래스

다음은 스택을 표현하는 완전한 자바스크립트 클래스입니다. 최대 크기(maxSize)를 지정해 오버플로우를 방지하고, 스택이 비어 있는지 확인하는 기능까지 포함되어 있습니다.

class Stack {
   constructor(maxSize) { // 최대 크기를 지정하지 않으면 기본값 10으로 설정
      if (isNaN(maxSize)) {
         maxSize = 10;
      }
      this.maxSize = maxSize; // 스택 값을 담을 배열 초기화
      this.container = [];
   }
   display() {
      console.log(this.container);
   }
   isEmpty() {
      return this.container.length === 0;
   }
   isFull() {
      return this.container.length >= this.maxSize;
   }
   push(element) { // 스택이 가득 찼는지 확인
      if (this.isFull()) {
         console.log("Stack Overflow!");
         return;
      }
      this.container.push(element);
   }
   pop() { // 스택이 비어 있는지 확인
      if (this.isEmpty()) {
         console.log("Stack Underflow!");
         return;
      }
      this.container.pop();
   }
   peek() {
      if (this.isEmpty()) {
         console.log("Stack Underflow!");
         return;
      }
      return this.container[this.container.length - 1];
   }
   clear() {
      this.container = [];
   }
}

주요 메서드 설명

  • constructor(maxSize): 스택의 최대 크기를 설정합니다. 값을 지정하지 않으면 기본값 10이 적용됩니다.
  • push(element): 스택이 가득 차 있으면 "Stack Overflow!" 메시지를 출력하고, 여유가 있다면 요소를 추가합니다.
  • pop(): 스택이 비어 있으면 "Stack Underflow!" 메시지를 출력하고, 요소가 있다면 맨 위 요소를 제거합니다.
  • peek(): 요소를 제거하지 않고 맨 위 요소만 확인합니다.
  • isEmpty() / isFull(): 각각 스택이 비었는지, 가득 찼는지 여부를 불리언 값으로 반환합니다.
  • clear(): 스택의 모든 요소를 제거하고 초기 상태로 되돌립니다.

참고: 원본 코드의 peek() 메서드에는 this.isEmpty()가 아닌 isEmpty()를 호출하는 오류가 있었습니다. 위 코드에서는 이 부분을 수정해 정상적으로 동작하도록 개선했습니다.