[JavaScript] 4-3. JavaScript Queue, Stack, Tree

JavaScript Queue, Stack, Tree


어떤 데이터의 구체적인 구현 방식은 생략한 채,
데이터의 추상적 형태와 그 데이터를 다루는 방법만을 정해놓은 것을 가지고, ADT 혹은 추상 자료형이라고 합니다.


큐(Queue)

큐(Queue)는 다음과 같은 성질을 갖는 자료형입니다.


큐에서는 가장 앞에 있는 요소를 전단(Front), 가장 뒤에 있는 요소를 후단(Rear)라고 합니다.
큐는 선입선출이라고 말씀드렸듯이 제거는 전단에서 이루어지며, 삽입은 후단에서 이루어집니다.
배열로 쉽게 큐를 구현을 해보자면 다음과 같습니다.

// 큐 정의
class Queue {
  constructor() {
    this._arr = [];
  }
  // 데이터를 넣는 euqueue는 후단에서 삽입됩니다.
  enqueue(item) {
    this._arr.push(item);
  }
  // 데이터를 추출하는 dequeue는 전단에서 이루어집니다.
  dequeue() {
    return this._arr.shift();
  }
}

const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.dequeue(); // 1

이처럼 큐는 순서대로 처리해야 하는 작업을 임시로 저장해두는 버퍼(buffer)로서 많이 사용됩니다.

[활용예시]



스택(Stack)

스택(Stack)은 다음과 같은 성질을 갖는 자료형입니다.


스택은 후입선출(LIFO)라는 특징을 가졌다고 말씀드렸다시피 입력과 삭제가 후단에서 모두 이루어집니다.
배열로 쉽게 스택을 구현해보면 다음과 같습니다.

// 스택 정의
class Stack {
  constructor() {
    this._arr = [];
  }
  // 데이터를 넣는 enqueue는 후단에서 삽입됩니다.
  push(item) {
    this._arr.push(item);
  }
  // 후입선출이기에 데이터를 추출하는 dequeue는 후단에서 아루어집됩니다.
  pop() {
    return this._arr.pop();
  }
  peek() {
    return this._arr[this._arr.length - 1];
  }
}

const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.pop(); // 3

이처럼 스택은 서로 관계가 있는 여러 작업을 연달아 수행하면서 이전의 내용 작업을 저장해 둘 필요가 있을 때 널리 사용됩니다.

[활용예시]



트리 (Tree)

트리(tree)는 여러 데이터가 계층 구조 안에서 서로 연결된 형태를 나타낼 때 사용됩니다.

앞서 공부했던 DOM 을 Tree 형식으로 나타낸 것입니다.

트리는 노드로 구성되어 있는데 노드란 무엇일까요?

다음은 노드의 종류입니다.

다음은 아주 간단한 형태의 Node를 구현한 예입니다.

class Node {
  constructor(content, children = []) {
    this.content = content;
    this.children = children;
  }
}

const tree = new Node("hello", [
  new Node("world"),
  new Node("and"),
  new Node("fun", [new Node("javascript!")])
]);

function traverse(node) {
  console.log(node.content);
  for (let child of node.children) {
    traverse(child);
  }
}

traverse(tree);
// hello world and fun javascript!

트리는 계층 구조를 나타내기 위해, 또한 계층 구조를 통해 알고리즘의 효율을 높이고자 할 때 널리 사용됩니다.



2. Today I Found Out

앞서 배웠던 내용이랑 조금씩 교집합이 있어서 학습하기에 훨씬 수월했습니다.
큐와 스택의 차이점을 알아볼 수 있었고, 각각 어떤 특징을 지니고 있는지 알 수 있었습니다.
공부를 하면서 다양한 자료구조를 조금 더 알아보고 싶다는 생각이 들었고,
어떻게 자료구조를 활용할지 좀 더 궁금함을 가지고 보려고 합니다.
또한 수업떄 궁금증을 질문할 예정입니다.



3. refer

https://helloworldjavascript.net/pages/282-data-structures.html

http://blog.eairship.kr/213

http://estenpark.tistory.com/15