자료구조 & 알고리즘
[자료구조] 스택(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가 구현된 것을 확인할 수 있다.