자료구조 & 알고리즘

[자료구조] 스택(Stack) 정의 및 실습

진기명기 2023. 3. 13. 23:31
🫠 선형자료구조 - 스택(Stack)은 코딩테스트는 물론 js 기능 구현 등 많은 곳에 쓰인다. 뭔가 두리뭉실하게 알고는 있지만, 막상 코드를 작성해 보라고 하면 제대로 구조를 파악하기 어려울 것 같아 아래와 같이 정리해보고자 한다.

 

 

 


🫠 스택(Stack)이란?

- 대표적인 특징 : LIFO (Last In First Out) 가장 마지막에 들어온 것이 가장 먼저 나간다.

- 그림 설명 > 스택 공간에 data = 0이 있는 상태에서 data = 1이 들어오게 되면 위로 쌓이게 되는 구조이며, pop()으로 가장 끝 data를 삭제하는 것과 같이 맨 위에 있는 data  = 1이 삭제되는 것이 특징이다. 

- 일반적인 배열을 왼 -> 오 배열로 push가 된다면, 스택은 아래 -> 위로 쌓이는 구조라고 쉽게 생각하면 된다.

(아이패드가 없어 매우 초라한 그림..)

 

 


🫠 스택(Stack)의 생성자 함수를 구현해보자

// stack() : 생성자 함수

function Stack(array){
  this.array = array ? array : [] // 배열이 들어오지 않은 경우 -> 빈배열
}
✅ 3항 연산자를 사용하여 생성자 함수를 정의하였다. 인자값으로 array를 받지만, 만약 들어오지 않은 경우 빈배열([]) return

 

 

 

🫠 스택(Stack)의 메서드를 구현해 보자 ①

> getBuffer() : 객체 내 데이터 셋 반환(배열 내 요소 전부 복사)

Stack.prototype.getBuffer = function(){
  return this.array.slice() // slice내에 옵션을 주지 않을 경우 (배열 내의 모든 요소 복사)
}
slice()는 배열 내 모든 요소를 복사하는 특징도 가지고 있으니 활용하자!

 

 

 

🫠 스택(Stack)의 메서드를 구현해보자 ②

> isEmpty() : 객체 내 데이터 존재 여부

Stack.prototype.isEmpty = function(){
  return this.array.length === 0
}
✅ 만약 배열의 길이가 0이라면 빈배열이므로 반환 값 true

 

 

 

❗️ 메서드를 사용하여 출력해 보자

let stack = new Stack([1, 2, 3])
console.log(stack) // Stack { array: [ 1, 2, 3 ] }

let data = stack.getBuffer() // getBuffer 함수를 통해 배열 복사
console.log(data) // [ 1, 2, 3 ]
console.log(data === stack.array) // false (배열 값만 복사한 것을 확인)
console.log(stack.isEmpty()) // false (빈배열이 아님을 확인)

console.log(Object.getOwnPropertyDescriptors(Stack.prototype))
/*
{
  constructor: {
    value: [Function: Stack],
    writable: true,
    enumerable: false,
    configurable: true
  },
  getBuffer: {
    value: [Function (anonymous)],
    writable: true,
    enumerable: true,
    configurable: true
  },
  isEmpty: {
    value: [Function (anonymous)],
    writable: true,
    enumerable: true,
    configurable: true
  }
}
*/
👉🏻 output : 주석 처리 확인
✅ stack 객체를 생성자 함수 Stack을 통해 구현
✅ getBuffer() 메서드를 통해 stack의 값을 복사한 data를 생성했지만, 둘은 같지 않기 때문에 false가 출력된 것을 확인할 수 있다. 즉, 온전히 값만 복사된 것
✅ isEmpty() 메서드를 통해 빈 배열이 아님을 확인할 수 있다.
✅ Object 메서드인 getOwnPropertyDescriptors를 통해 내가 작성한 생성자 함수 Stack에 메서드 getBuffer와 isEmpty가 구현된 것을 확인할 수 있다.