👉🏻 새로운 섹션에 들어가면서 자료구조에 대해 배우게 되었다. 매번 알고리즘 문제를 푸는데 막막하였는데 이렇게 자료구조를 학습하게 되어 도움이 될 것 같다. Stack
과 Queue
를 학습하며 느낀 것은 정의, 구조, 특징 모두 간단하고 쉬우나 이를 실제로 내가 사용하려고 할 때 어려움이 있었다. 아직 낯선 것 같다. 다시 정리하며 복습해보고자 한다.
✏️ 자료구조의 정의
→
자료구조
란 여러 데이터의 묶음을 저장하고 사용하는 방법을 정의한 것이다.✏️ 자료구조의 분류
→ 자주 등장하는 네 가지의 자료구조 :Stack
,Queue
,Tree
,Graph
✏️ 자료구조의 특징
→ 자료구조는
특정한 상황에 놓인 문제를 해결하는 데에 특화
되어 있다.
그래서 많은 자료구조를 알아두면, 적합한 자료구조를 빠르고 정확하게 적용하여 문제 해결이 가능하다.
✏️ 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 자료구조의 정책 :
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; } }