TIL_2023.06.01

이얏호·2023년 6월 1일
0
post-custom-banner

자료구조!!

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

스택과 큐에 대해서 배웠다.

간략하게 한 문장씩으로 정리하자면,
스택은 후입선출!
큐는 선입선출! 편의점 알바를 했어서 그런지 확 와닿았다.

우선 스택부터...
스택은 후입선출이기에 가장 마지막에 저장된 자료가 제일 위에 존재해야하고 그걸 꺼내주어야한다 관련 함수를 작성해보았다.


우선 자료를 저장해주는 push함수이다.

push(value) {
    if (this.head === null) {
      this.head = new Node(value);
    } else {
      let temp = this.head;
      this.head = new Node(value);
      this.head.next = temp;
    }
  }

우선 this.head가 존재하는지 확인해서 없다면 바로 새로운 Node를 this.head로 지정해주었다.
그렇지 않을 경우(현재 this.head가 존재하는 경우)에는 this.head를 temp변수에 담아서 유지 시킨후에 새로이 this.head에 new Node를 담아주었다. 그 후 바뀐 this.head의 next부분에 아까전에 담아두었던 temp를 다시 할당해주었다.
로직 상으로는 이상이 없다고 생각했으나 좀 더 간략한 방법이 존재했다...

push(value) {
    const newNode = new Node(value);
    newNode.next = this.head;
    this.head = newNode;
  }

head의 존재 여부랑 상관없이 우선 새로운 Node를 newNode 변수에 담아주고 newNode의 next에 this.head를 할당해준다.
여기서 만약에 head가 없는 상황일지라도 null이 들어가므로 아무런 이상이 없다. 그 후 this.head를 newNode로 바꿔준다.

이렇게 적힌게 더 간략하고 깔끔한 코드였다.


다음은 맨 위의 자료를 살펴보기만 하는 peek함수이다.

peek() {
    if(this.head === null){
      return null
    }
    return this.head.data
  }

스택의 구조의 경우 가장 상단에 존재하는 객체를 head로 지정해두기에
head의 값이 null일 경우만 예외적으로 처리해주고 그렇지 않은 경우에는 바로 this.head.data를 통해서 해당 값을 엿볼 수 있었다.


다음은 맨 위의 자료를 꺼내서 구경하는 pop함수이다.
peek와 다른 점은 단순히 보기만 하는게 아니라. 자료를 스택에서 꺼낸다는 유의점이 있다.

pop() {
	if (this.head === null) {
      return null;
    }
    const temp = this.head;
    this.head = temp.next;
    return temp.data;
  }

우선 마찬가지로 head가 없을 경우 null처리를 해준다.
그리고 temp에 현재 head를 담아준 후
this.head를 temp의 next / 그러니까 제일 위에서 두 번째에 위치한 자료로 this.head를 교체해준다.
그 후 저장해뒀던 temp를 통해서 temp.data값을 반환해준다.



다음은 큐이다.
큐는 선출선입, 즉 먼저 들어간 자료가 가장 먼저 빠져나오는 일방통행 구조라고 생각하면 된다.

우선은 큐에 자료를 저장해주는 enqueue함수이다.

enqueue(value) {
    const newNode = new Node(value);
    if(this.head === null){
      this.head = newNode
      this.tail = newNode
    }else{
      this.tail.next = newNode
    }
  }

우선 newNode변수를 선언하여 새로운 Node를 할당해주었다.
그 후 this.head값이 null인지 확인하여 값이 없을 경우(head가 없다면 tail도 없는 상황이다.)에는 this.head와 this.tail에 newNode값을 넣어준다.

만약 head가 존재한다면(tail도 당연히 존재한다.) this.tail.next에 newNode를 담아준다.

이러면 자연스럽게 순차적으로 자료가 쌓이게 된다.

다음은 스택에서 pop함수처럼 자료를 확인하면서 빼내는 dequeue함수이다.(다만 pop과는 자료가 들어오고 나가는 방향이 다르다.)

dequeue() {
    if (this.head === null) {
      return null;
    }
    const node = this.head;
    this.head = node.next;
    return node.data;
  }

우선 head가 없을 경우 null을 반환하도록 해주었다.
그리고 null이 아닐 경우,
node변수를 선언하여 this.head를 할당해주었고
this.head에 node.next값을 담아준다.(두 번째로 들어가있던 자료.)
그 후 node의 data값을 반환해준다.



이렇게 자료 구조 중 스택과 큐에 대해서 배웠다.
큐는 일반적인 상황에서 많이 익숙한 방식이라서 괜찮았는데
스택이 오히려 살짝 낯설었다.
다만 각종 작업 프로그램의 컨트롤 z와 같은 곳에서 비슷하게 쓰이는 방식이라는 설명이 이해하기 쉬웠던 것 같다.

profile
열심히 신나게 화이팅!
post-custom-banner

0개의 댓글