스택은 LIFO(Last-In-First-Out) 자료구조로, 먼저 들어온 요소가 제일 마지막에 나가는 구조로 구현할 수 잇다.
들어온 값들을 원소로 하는 리스트를 가지며, 스택의 상단을 Top이라고 부르며, 하단을 Bottom이라고 부른다.
일단 스택은 단순해서 구현이 쉽다.
구현은 단순하지만 LIFO 구조로, 함수나 데이터 그리고 메모리 관리에 매우 유용하게 사용된다.
Stack의 Top에서 데이터를 읽고 저장할 수 있어 데이터를 읽고 쓰는 속도가 빠르다.
스택은 크기를 미리 지정해야 하기 때문에 나중에 공간이 부족할 수도 있고, 또는 크기를 너무 크게 지정해서 공간이 너무 많이 남아 메모리 낭비가 발생할 수도 있다.
(요새는 메모리 용량 대비 가격이 싼 편이기 때문에 넉넉히 잡아도 걱정하지 않아도 될 듯..)
class Stack {
constructor(list = []){
this.list = list;
}
}
스택의 Top 위치에 data를 추가합니다.
push(data) {
if(data === null || data === undefined) return false;
this.list[this.size()] = data;
return true;
}
스택의 Top - 1 위치에 있는 데이터를 삭제하고, 해당 데이터를 반환합니다.
pop() {
if(this.list.isEmpty) return false;
return this.list.pop();
}
스택에 추가된 데이터가 없으면 true를 반환하고, 있으면 false를 반환합니다.
isEmpty() {
return this.list.length == 0 ? true : false;
}
스택 내에 추가되어 있는 데이터의 개수를 반환합니다.
size() {
return this.list.length;
}
스택 내의 데이터를 리스트로 반환합니다.
getBuffer() {
return this.list.slice();
}
스택의 Top - 1 위치에 있는 데이터를 반환합니다.
peek() {
return this.list[this.size() - 1];
}
스택 내에 data 위치를 찾아 해당 인덱스를 반환하고, 없으면 -1을 반환합니다.
indexOf(data) {
if(data === null || data === undefined) return false;
for(let i = 0 ; i < this.size(); i++) {
if(this.list[i] === data) return i;
}
return -1;
}
스택 내에 추가된 데이터 중에 data와 동일한 데이터가 있으면 true를, 없으면 false를 반환합니다.
includes(data) {
if(data === null || data === undefined) return false;
for(let i = 0 ; i < this.size(); i++) {
if(this.list[i] === data) return true;
}
return false;
}