[자료구조] 선형구조 , Stack과 Queue

fejigu·2022년 9월 20일
1

알고리즘 & 자료구조

목록 보기
23/24


👉🏻 새로운 섹션에 들어가면서 자료구조에 대해 배우게 되었다. 매번 알고리즘 문제를 푸는데 막막하였는데 이렇게 자료구조를 학습하게 되어 도움이 될 것 같다. StackQueue를 학습하며 느낀 것은 정의, 구조, 특징 모두 간단하고 쉬우나 이를 실제로 내가 사용하려고 할 때 어려움이 있었다. 아직 낯선 것 같다. 다시 정리하며 복습해보고자 한다.


📍 자료구조란 ?

✏️ 자료구조의 정의

자료구조란 여러 데이터의 묶음을 저장하고 사용하는 방법을 정의한 것이다.

✏️ 자료구조의 분류


→ 자주 등장하는 네 가지의 자료구조 : Stack, Queue, Tree, Graph

✏️ 자료구조의 특징

→ 자료구조는 특정한 상황에 놓인 문제를 해결하는 데에 특화되어 있다.
그래서 많은 자료구조를 알아두면, 적합한 자료구조를 빠르고 정확하게 적용하여 문제 해결이 가능하다.


📍 Stack(스택)

✏️ Stack의 정의

Stack은 쌓다, 쌓이다, 포개지다와 같은 뜻으로, 데이터를 순서대로 쌓는 자료구조이다.

✏️ Stack의 구조

→ Stack 자료구조의 정책 : LIFO(Last In First Out) 혹은 FILO(First In Last Out)
입력과 출력이 하나의 방향, 제한적 접근
→ 데이터를 넣는 것 : PUSH, 데이터를 꺼내는 것 : POP
→ 이해를 위한 예시) 막힌 골목길(STACK)에 들어간 차들(data)

✏️ Stack의 특징

1) 후입 선출의 구조
2) 데이터가 아무리 많아도 하나씩 넣고 뺀다(한꺼번에 여러개 불가능)
3) 데이터의 입출력 방향이 같다
4) 저장되는 데이터는 유한하고 정적(스택에 저장되는 데이터 : 로컬 변수, 포인터 및 함수 프레임)
5) 스택의 크기가 제한적, 스택 오버플로 같은 에러 자주 발생

✏️ Stack의 실사용 예제

앞으로 가기, 뒤로 가기 기능

✏️ Stack 구현하기

class Stack {
  constructor() {
    this.storage = {};
    this.top = 0; // 스택의 가장 상단을 가리키는 포인터 변수를 초기화 
  }
  size() {
    return this.top;
  }
	// 스택에 데이터를 추가 할 수 있어야 
  push(element) {
    this.storage[this.top] = element;
    this.top += 1;
  }	
	// 가장 나중에 추가된 데이터가 가장 먼저 추출
  pop() {
    // 빈 스택에 pop 연산을 적용해도 에러가 발생하지 않아야 
    if (this.size() === 0) {
      return;
    }
   const result = this.storage[this.top - 1];
    delete this.storage[this.top - 1];
    this.top -= 1;
    return result;
  }
}

📍Queue(큐)

✏️ Queue의 정의

Queue줄을 서서 기다리다, 대기 행렬이라는 뜻입니다.

✏️ Queue의 구조

→ Queue 자료구조의 정책 : FIFO(First In First Out) 혹은 LILO(Last In Last Out)
→ 입력과 출력의 방향이 고정되어 있으며, 두 곳으로 접근 가능
→ Queue에 데이터를 넣는 것 : enqueue, 데이터를 꺼내는 것 : dequeue
데이터를 입력된 순서대로 처리할 때 주로 사용
→ 이해를 위한 예시) 톨게이트(Queue)를 지나가는 자동차들(data)

✏️ Queue의 특징

1) 선입선출
2) 데이터가 아무리 많아도 하나씩 넣고 뺀다
3) 데이터 입력, 출력 방향이 다르다

✏️ Queue의 실사용 예제


컴퓨터에 연결된 프린터
→ 각 장치 사이에 존재하는 속도의 차이나 시간 차이를 극복하기 위해 임시 기억 장치의 자료구조로 Queue를 사용한다. 이것을 통틀어 버퍼(buffer)

✏️ Queue 구현하기

class Queue {
  constructor() {
    this.storage = {};
    this.front = 0;
    this.rear = 0;
  }
  size() {
    return this.rear - this.front;
  }	
	// 큐에 데이터를 추가 할 수 있어야 
  enqueue(element) {
    this.storage[this.rear] = element;
    this.rear += 1;
  }	
	// 가장 먼저 추가된 데이터가 가장 먼저 추출되어야 
  dequeue() {
    // 빈 큐에 dequeue 연산을 적용해도 에러가 발생하지 않아야 
    if (this.size() === 0) {
      return;
    }
    const result = this.storage[this.front];
    delete this.storage[this.front];
    this.front += 1;
    return result;
  }
}
profile
console.log(frontendjigu( ☕️, 📱); // true

0개의 댓글