## ADT(abstract data type, 추상 데이터 타입)
- 데이터와 그 데이터에 대한 연산들을 묶어놓은 하나의 논리적 단위로 정의되는 프로그래밍의 추상화
- 데이터와 그 데이터를 다루는 연산들을 분리하여 정의하며, 이로써 어떤 데이터가 어떤 연산을 지원하는지에 대한 논리적 틀을 제공함
<br>
#### Stack
- **LIFO**: Last-In, First-Out
- 한쪽 끝에서만 접근 가능한 자료구조
- 연산 종류
- Push: 스택에 아이템 하나 추가
- Pop: 스택에서 아이템 하나 제거
- IsEmpty: 스택이 비었는지 확인
- 배열 아이템 순서 바꾸는데 용이함
<br>
#### Queue
- **FIFO**: First-In, First-Out
- 연산 종류
- Enqueue: 큐에 아이템 하나 추가
- Dequeue: 큐에서 아이템 하나 제거
- IsEmpty: 큐가 비었는지 확인
- RR scheduling algorithm에 사용됨
<br>
#### Linked List
![[linked_list.png|w80|center]]
- 다음 데이터가 어디에 저장되어 있는지 주소값(link)을 가지는 자료구조
- 같은 데이터 타입의, 선형적인 자료구조
- 연산 종류
- Insert: 아이템 하나 삽입
- Delete: 아이템 하나 삭제
- IsThere: 아이템이 리스트에 있는지 체크
- GetLength: 리스트의 길이 확인
- Reset, GetNext, MoreItems: 아이템 순회(iteration)에 용이한 메소드
- 연산에서 주의할 점
- Delete
- 현재 노드를 가리키고 있는 이전 노드의 포인터를 현재 노드가 가리키고 있는 노드의 주소로 변경
- Insert
- 추가하고 싶은 위치를 찾아서 이전 노드의 포인트가 추가하고자 하는 노드를 가리키게 변경하고, 추가하는 노드의 포인터는 이전 노드가 기존에 가리키고 있던 노드를 가리키도록 수정
- 연결리스트와 배열 비교하기
- 가장 크게는 저장하는 방식이 다름
- 배열: 물리적인 저장 공간에 연속적으로 저장됨 (index로 참조하기 위해)
- 리스트: 메모리에 연속적으로 저장될 필요가 없음, **하나의 노드에 데이터+링크(포인터)가 함께 저장됨**
- 배열은 프로그래밍 언어에 대부분 포함되어 있으나, 리스트는 직접 구현해야 하는 경우가 있음
<br>
#### Tree
- 복잡한 관계를 표현 가능한 계층이 있는 자료구조
- parent node, child node: 상위 노드와 하위 노드의 관계성
- sibling node: 같은 계층에 있는 노드
- **root** node: 가장 상단에 있는 노드, parent node가 없는 노드
- leaf node: 가장 하단에 있는 노드, child node가 없는 노드
- internal node: root node와 leaf node 사이에 있는 노드
<br>
> **Binary Tree**
> 각 노드가 2개 이하의 child node를 가지는 트리
<br>
###### ==Binary Search Tree(BST)==
- 기존 트리는 unsorted list와 유사해서 검색을 위해서는 모든 트리를 순회해야 하지만, BST처럼 정렬된 상태, 의미 있는 순서로 저장하면 검색이 쉬워짐
![[binary_search_tree.png|w80|center]]
- 어떠한 노드에서든 왼쪽 subtree에 있는 노드들보다는 값이 커야하고, 오른쪽 subtree에 있는 노드들보다는 값이 커야함
- balanced tree인 경우에는 검색에 O(log n)이 걸리지만 최악의 경우(skewed tree) O(n)이 걸림
- n개의 노드가 있을 때, 트리의 높이는 최소 log n
<br>
#### Graph ✨
![[data_structure_graph.png]]
- G = (V,E)
- vertice라 불리는 node의 집합과 edges라 불리는 링크로 구성된 자료구조
- vertice는 객체를 나타내고 edge는 vertice 간의 관계를 나타냄
- edge를 인접 행렬 혹은 연결 리스트로 표현함
- 방향 유무에 따라, 가중치 유무에 따라 그래프 유형을 나눌 수 있음
- 트리는 순회가 없는 그래프라고 볼 수 있음
<br>
###### DFS(Depth-First-Search)
- 시작 노드에서 출발하여 최대한 깊게 탐색한 후, 더 이상 진행할 수 없을 때 다시 돌아와 다른 경로로 진행하는 방식
- 스택(Stack) 또는 재귀 함수를 사용하여 구현 가능
- 경로의 존재 여부를 찾거나 모든 해를 찾는 데 유용함
![[DFS.png|w70|center]]
<br>
###### BFS(Breadth-First-Search)
- 시작 노드에서 시작하여 인접한 모든 노드를 먼저 탐색한 후, 그 다음 레벨의 노드로 이동하는 방식
- 큐(Queue)를 사용하여 구현 가능
- 최단 경로를 찾거나 어떤 형태의 '최단 거리' 문제에 유용함
![[BFS.png|w70|center]]
<br>
###### SSSP(Single-Source Shortest-Path, Dijkstra Algorithm)
- 우선순위 큐(priority queue)를 사용함
- 큐에서 꺼낼 때 우선 순위가 높은 아이템부터 꺼냄
<br>
#### Subprograms(function, 함수)
###### Parameter Passing
- (formal) parameters : 형식 인자, 함수 선언에 사용되는 인자
- 함수 내에서 사용하는 일시적인 identifier
- (actual) arguments : 실제 인자, 함수 호출 시 사용되는 인자
<br>
<br>
<br>
<br>