Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

레커

[TIL] Stack / Queue / linkedlist 구현 본문

카테고리 없음

[TIL] Stack / Queue / linkedlist 구현

Prism Wrecker 2023. 10. 17. 19:49

 

Stack 

Last In First Out  나중에 들어온 자료를 먼저 처리하는 형태

class Stack {
  constructor() {
    this.arr = [];
    this.index = 0;
  }
  push(value) {
    this.arr[this.index] = value;
    this.index++;
  }

  pop() {
    if (this.index <= 0) return null;
    this.index--;
    const result = this.arr[this.index];
    return result;
  }
}

let stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());

Queue 

First In First Out  먼저 들어온 데이터가 먼저 나가는 형태

class Queue {
  constructor() {
    this.arr = [];
    this.index = 0;
  }
  push(value) {
    this.arr[this.index] = value;
    this.index++;
  }

  pop() {
    this.arr.splice(0, 1);
  }
  front() {
    return this.arr[0];
  }
}

let queue = new Queue();
queue.push(1);
queue.push(2);
queue.push(3);
console.log(queue.front());
queue.pop();
console.log(queue.front());

linkedlist 

  • 유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조
  • 링크드 리스트 요소의 삽입/삭제에 강점이 있다. 
  • 빈번하게 데이터를 삽입/삭제 해야하는 경우에 사용하면 좋다. 
class Node {
  constructor(data) {
    this.data = data;
    this.link = null;
  }
}
class LinkedList {
  constructor(data) {
    this.head = new Node(data);
  }

  append_Last(val) {
    let last = new Node(val);
    if (this.head == null) {
      this.head = temp;
    } else {
      let temp = this.head;
      while (temp.link != null) {
        temp = temp.link;
      }
      temp.link = last;
    }
  }
  append_First(val) {
    let first = new Node(val);
    if (this.head == null) {
      this.head = first;
    } else {
      let temp = this.head;
      this.head = first;
      this.head.link = temp;
    }
  }

  append_Insert(node, val) {
    let currentLink = this.head;
    let nextLink = null;
    while (currentLink != node) {
      if (currentLink == null) {
        break;
      }
      currentLink = currentLink.link;
    }
    if (currentLink == null) {
      //일치하는 값 없음
      this.append_Last(val);
    } else {
      nextLink = currentLink.link;
      currentLink.link = new Node(val);
      currentLink.link.link = nextLink;
    }
  }

  delete(node) {
    let currentLink = this.head;
    let preLink = this.head;

    while (currentLink != node) {
      if (currentLink == null) {
        break;
      }
      preLink = currentLink;
      currentLink = currentLink.link;
    }

    if (currentLink == null) {
    } else {
      preLink.link = currentLink.link;
    }
  }
  get_NodeOne(node) {
    let currNode = this.head;
    while (currNode != node) {
      if (currNode == null) {
        break;
      }
      currNode = currNode.link;
    }
    if (currNode == null) {
      console.log("일치값이 없음");
    }
    return currNode;
  }

  get_All() {
    let temp = this.head;
    let result = [];
    while (true) {
      result.push(temp.data);
      if (temp.link == null) {
        break;
      }
      temp = temp.link;
    }
    return result;
  }
}
let test = new LinkedList(20);

test.append_Last(60);
test.append_Last(40);
test.append_Last(50);
console.log(test.get_All());
test.append_Insert(test.head.link, 30);
console.log(test.get_All());
test.delete(test.head.link);
console.log(test.get_All());
test.append_First(10);
console.log(test.get_All());