스택이란 자료구조는 사전적 정의인 '쌓다' '더미' 와 같습니다. 쉽게 설명하자면, 밑이 막힌 상자를 생각하시면 됩니다. 밑이 막혔으니 위로만 물건을 집어 넣을 수 있고, 뺄 수가 있겠죠? 이러한 구조 때문에 먼저 들어온 물건은 나중에 나갈 수 있고, 나중에 들어온 물건은 먼저 나갈 수 있게 됩니다. 이러한 구조를 '선입후출' '후입선출' 이라고 합니다.
자료구조를 공부하는 데 있어 코드로 구현하는 것도 중요하지만, 그보다 중요한 것은 자료구조를 어떻게 사용할지 아는 것이 더 중요합니다. 모든 자료구조는 [삽입],[삭제],[읽기]를 기본으로 가집니다. 따라서 앞으로 자료구조의 사용법은 이 세가지 위주로 알아보겠습니다.
우리가 많이 사용하는 브라우저를 생각해봅시다. 인터넷 서핑을 하다가 뒤로가고 싶을 때, 뒤로가기 버튼을 사용합니다. '뒤로가기'버튼이 바로 스택으로 구현된 메쏘드(method) 중 하나입니다.
앞서 스택은 밑이 막힌 상자라고 하였습니다. 상자에 들어 갈 물건들은 그 동안 서핑하였던 인터넷 페이지들 입니다. 그러면 제일 마지막에 봤던 페이지는 가장 위에 쌓여져 있겠지요? (참고로, 우리 눈에 보여지는 페이지는 가장 위에 있는 페이지입니다.) 상자에 들어있는 물건을 빼는 것이 '뒤로가기'입니다. 즉 물건을 빼면 가장 최근에 본 페이지가 빠지겠지요. 그럼 가장 위에 쌓여져 있는 물건은 그 전에 봤던 페이지입니다. 따라서 '뒤로가기'버튼을 누르면 지금 보고 있는 페이지(스택의 최상위)가 빠져나가면서, 이전에 봤던 페이지가 보여지게 됩니다. 이렇게 '뒤로가기' 버튼은 스택의 구조로 구성되어 있습니다.
push(element)
- 요소를 스택의 최상단에 추가합니다.pop()
- 스택의 최상단에서 요소를 제거하고 반환합니다.size()
- 스택의 현재 요소 개수를 반환합니다.class Stack {
constructor() {
this.storage = {};
this.top = 0;
}
size() {
//스택에 현재 몇개의 접시가 있는지 확인하는 로직
if(this.top <= 0) {
return 0;
} else {
return this.top;
}
}
push(element) {
if(this.top <= 0) {
this.top = 0; //0보다 작을 경우 , 0으로 세팅
this.storage[this.top] = element;
this.top ++;
}
else {
this.storage[this.top] = element;
this.top ++;
}
}
pop() {
if(this.top < 0) {
return;
}
delete this.storage[this.top];
this.top--;
return this.storage[this.top];
}
}
module.exports = Stack;
class Queue {
constructor() {
this.storage = {};
this.front = 0;
this.rear = 0;
}
size() {
if(this.front === this.rear) {
return 0;
} else {
return this.rear - this.front;
}
}
enqueue(element) {
//storage 제일 마지막 인덱스로 추가하는 함수
this.storage[this.rear] = element;
this.rear++;
}
dequeue() {
//요소를 큐의 앞에서 제거하고 반환합니다.
if(this.front === this.rear) {
return this.storage;
}
let deleteEl = this.storage[this.front];
delete this.storage[this.front];
this.front++;
return deleteEl;
}
}
module.exports = Queue;