- 스택이란 무엇인가?
- 스택은 어디에 사용하는가?
- 스택 구현하기
LIFO : Last In First Out
마지막에 들어간것이 처음으로 제거되는 자료구조입니다.
책같이 쌓여있는 물건을 맨 위에서부터 꺼내는 방식과 같습니다.
- 재귀에서 사용했던 Call Stack도 Stack입니다.
- 함수 호출을 관리할떄 사용합니다.
- 워드에서 Undo(Ctrl + z) / Redo를 할때 사용합니다.
- 라우팅(우리가 방문한 기록)
// 효율적
let stack = [];
stack.push('Google');
stack.push('Instagram');
stack.push('youtube');
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());
// 비효율적
// shift와 unshift가 index를 바꿈
let stack2 = [];
stack2.unshift('Google');
stack2.unshift('Instagram');
stack2.unshift('youtube');
console.log(stack2.shift());
console.log(stack2.shift());
console.log(stack2.shift());- pop과 push를 사용하게 되면 pop을 사용할 때 마지막까지 Loop를 사용해야하기 때문에 메모리 소모가 많습니다.
- 따라서 unshift와 shift를 사용해서 Stacks를 구현하겠습니다.
class Stack {
constructor() {
this.first = null;
this.last = null;
this.size = 0;
}
push(val) {
let newNode = new Node(val);
if (!this.first) {
this.first = newNode;
this.last = newNode;
} else {
let temp = this.first;
this.first = newNode;
this.first.next = temp;
}
return ++this.size;
}
}-
Pushing 의사코드
- 함수는 값을 인자로 받습니다.
- 받은 값을 이용해 새 노드를 만듭니다.
- if 노드가 없으면 first와 last 프로퍼티를 새로 생성한 노드로 지정합니다.
- 적어도 하나 이상의 노드가 존재한다면 stack 맨 처음에 노드를 추가합니다.
- 새로 생성한 노드를 first로 지정합니다.
- 이전에 생성한 노드의 next를 지정합니다.
- 사이즈를 1 증가시킵니다.
-
Push 구현
push(val) { let newNode = new Node(val); if (!this.first) { this.first = newNode; this.last = newNode; } else { let temp = this.first; this.first = newNode; this.first.next = temp; } return ++this.size; }
-
Pop 의사코드
- if 스택에 아무것도 없으면 return null
- 스택의 첫번째 프로퍼티를 저장할 임시 변수를 만들고 저장합니다.
- if 노드 한개만 있으면, first와 last 프로퍼티를 null로 합니다.
- if 노드가 한개 이상이면 temp에 저장된 첫번째 노드의 next를 새 first로 지정합니다.
- 사이즈를 1 감소합니다.
- 제거한 node를 return 합니다.
-
Pop 구현
pop() { if (!this.fist) return null; let temp = this.fist; if (this.first === this.last) { this.last = null; } this.first = this.first.next; this.size--; return temp.val; }
- Insertion - O(1)
- Removal - O(1)
- Searching - O(N)
- Access - O(N)
- 스택은 LIFO인 자료구조 입니다. 가장 마지막에 들어간 값이 맨 처음으로 출력됩니다.
- 스택은 함수 호출에 사용되고, undo/redo,라우팅(브라우저 기록)에도 사용됩니다.
- JavaScript에는 built in 자료구조가 없지만 비교적 쉽게 구현할 수 있습니다.
- 큐 정의
- Use case
- 구현
FIFO : First In First Out
처음 들어간 밸류가 처음 나오는 자료구조입니다.
- 백그라운드 작업
- Uploading
- Printing / Task 작업
- Enqueue 의사코드
- 함수는 값을 인자로 받습니다.
- 인자로 받으 값으로 새 노드를 만듭니다.
- if 노드에 아무것도 없으면, 새로 만든 노드를 first와 last로 설정합니다.
- 그렇지 않으면, 새로만든 노드를 last의 next로 지정하고 그 노드를 last로 다시 설정합니다.
-
Enqueue 구현
enqueue(val) { let newNode = new Node(val); if (!this.first) { this.first = newNode; this.lats = newNode; } else { this.last.next = newNode; this.last = newNode; } return ++this.size; }
-
Dequeue 의사코드
- if first 프로퍼티가 없으면 return null을 합니다.
- first 프로퍼티를 변수에 저장합니다.
if (this.first === this.last)이면 first와 last를 null로 설정합니다.- if 노드가 한개보다 많으면, first 프로퍼티로 first의 next를 설정합니다.
- 길이를 1 감소시킵니다.
- 삭제한 노드를 return 합니다.
-
Dequeue 구현
dequeue() { if (!this.first) return null; let temp = this.first; if (this.first === this.last) { this.last = null; } this.first = this.first.next; this.size--; return temp.value; }