์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ๋ฆฌ์คํธ๋?
- ์ ์
- ๋ฐฐ์ด๊ณผ์ ๋น๊ต
- ์ฐ์ฐ
- ์ฝ์
- ์ญ์
- ์ ๊ทผ
- ์ข ๋ฅ / ๊ตฌํ
๋ฆฌ์คํธ๋?
๋ฆฌ์คํธ๋ ์์๋ฅผ ๊ฐ์ง ํญ๋ชฉ๋ค์ ๋ชจ์์ด๋ค. ์ด๋ฅผ ๋ํ๋ด๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋๋ฐ, ํ๋๋ ๋ฐฐ์ด์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ณ ๋๋จธ์ง ํ๋๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐฐ์ด์ ์ด์ฉํ ๋ฆฌ์คํธ๋ฅผ ์ ํ๋ฆฌ์คํธ๋ผ๊ณ ํ๋๋ฐ ๊ตฌํ ์์ฒด๋ ๊ฐ๋จํ๊ณ ์์์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, ์ฝ์ / ์ญ์ ์ฐ์ฐ ์ ๋ค๋ฅธ ์์๋ค์ ์ด๋์ด ๋ถ๊ฐํผํ๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ํฌ๋ค. ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๊ตฌํ์ด ๋ณต์กํ๊ณ ์์ฐจ์ ๊ทผ์ด ํ์ํ์ง๋ง ์ฝ์ , ์ญ์ ๊ฐ ํจ์จ์ ์ด๋ค.
์ ์
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ์ ๋งํฌ๋ก ์ด๋ฃจ์ด์ง ๋ ธ๋๋ก ๊ตฌ์ฑ๋์ด์๋ค. ๋งํฌ๋ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค. ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฒ์์๋ ํค๋ ํฌ์ธํฐ๊ฐ ํค๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฉฐ, ๋ง์ง๋ง ๋ ธ๋์ ๋งํฌ๋ NULL๊ฐ์ด๋ค.
์์๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ๋ ธ๋๊ฐ ํ๋์ฉ ๋์ด๋๋ฉฐ, ๊ฐ ๋ ธ๋๋ค์ ๋งํฌ๋ก ์ฐ๊ฒฐ๋์ด์๋ค. ๋ฐ๋ผ์ ๋ ธ๋๋ค์ ๊ณ์ํด์ ์๊ฒจ๋ ์ ์์ผ๋ฉฐ ์ปดํ์ผ์๊ฐ์ ๊ฒฐ์ ๋๋ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์, ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ ๋น์ผ๋ก ๊ตฌํ๋๋ค.
๋ฐฐ์ด๊ณผ์ ๋น๊ต
- ์์ฐจ์ ๊ทผ์ด ํ์ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์์ ์ธ์ ํด์์ ํ์๊ฐ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ ํ์ด ์๋ค์ํผํ๋ค.
- ์ฝ์ / ์ญ์ ๊ฐ ํจ์จ์ ์ด๋ค.
์ฐ์ฐ
์ฝ์
์์ ๊ฐ์ ์ํ์์ ๋ ธ๋4๋ฅผ ์ฝ์ ํ๊ณ ์ถ์ ๋๋, ๋ ธ๋ 1์ link๊ฐ ๋ ธ๋4๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๊ณ ๋ ธ๋4์ link๊ฐ ๋ ธ๋2๋ฅผ๊ฐ๋ฆฌํค๊ฒ ์ธํ ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋ฐฐ์ด์์ ์ฝ์ ๊ณผ์ ์ ํ ์์๋ฅผ ํน์ ์์น์ ์ฝ์ ํ๊ธฐ ์ํด, ํด๋น index ์ดํ์ ์์๋ค์ ๋ชจ๋ ์ด๋์์ผ์ผํ์ง๋ง ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ทธ๋ด ํ์๊ฐ ์๋ค. ํ์ง๋ง ์ฝ์ ์์น์ ์ ํ ๋ ธ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ์์ฐจ์ ๊ทผ์ ํด์ผํ๋ ๋ถํธํจ์ ์์ ๊ฒ์ด๋ค.
์ญ์
์์ ๊ฐ์ ์ํ์์ ๋ ธ๋ 2๋ฅผ ์ญ์ ํ๊ณ ์ถ์ ๋๋ ๋ ธ๋1์ ๋งํฌ๊ฐ ๋ ธ๋3์ ๊ฐ๋ฆฌํค๊ฒ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์ญ์ ํ ๋ ธ๋2๋ heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ์ด์ผ ํ๋ค.
์ ๊ทผ
์ ๊ทผ์ ์์์ ๋ฐฐ์ด๊ณผ ๋น๊ตํ๋ฏ์ด ์์ฐจ์ ๊ทผ์ด ํ์ํด์ ์ฑ๋ฅ์ด ์ข์ง ์๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ํด์ ๊ฐ์ผ๋ก ์ด์ด์ง ๋๋ค๋ฅธ ๋งํฌ๋ฅผ ๋ง๋ค์ด๋๊ธฐ๋ ํ๋ค.
์ข ๋ฅ / ๊ตฌํ
- ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
#include <iostream>
#include <string>
using namespace std;
struct Node {
int data;
Node* link = nullptr;
};
void printNodes(Node* head) {
while (head != nullptr) {
cout << (*head).data << endl;
head = head->link;
}
}
void push(Node* node, Node*& head) {
node->link = head;
head = node;
}
Node* pop(Node*& head) {
if (head == nullptr)
return nullptr;
Node* tmp = head;
head = (*head).link;
return tmp;
}
int main() {
Node n1; Node n2; Node n3;
n1.data = 1; n2.data = 2; n3.data = 3;
Node* head = nullptr;
push(&n3, head);
push(&n2, head);
push(&n1, head);
printNodes(head); // ์ฝ์
ํ ์ถ๋ ฅ
cout << endl;
Node* n4 = pop(head);
if (n4 != nullptr) {
cout << "์ญ์ ๋ ๋ฐ์ดํฐ : " <<n4->data << endl; // ์ญ์ ํ ๋ฐ์ดํฐ ์ถ๋ ฅ
}
printNodes(head); // ์ญ์ ํ ์ถ๋ ฅ
}
- ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
#include <iostream>
#include <string>
using namespace std;
struct Node {
int data;
Node* post_link = nullptr;
Node* pre_link = nullptr;
};
void printNodes(Node* head) {
while (head != nullptr) {
cout << (*head).data << endl;
head = head->pre_link;
}
}
void push(Node* node, Node*& head) {
node->pre_link = head;
head = node;
}
Node* pop(Node*& head) {
if (head == nullptr)
return nullptr;
Node* tmp = head;
head = (*head).link;
return tmp;
}
int main() {
Node n1; Node n2; Node n3;
n1.data = 1; n2.data = 2; n3.data = 3;
Node* head = nullptr;
push(&n3, head);
push(&n2, head);
push(&n1, head);
printNodes(head); // ์ฝ์
ํ ์ถ๋ ฅ
cout << endl;
Node* n4 = pop(head);
if (n4 != nullptr) {
cout << "์ญ์ ๋ ๋ฐ์ดํฐ : " <<n4->data << endl; // ์ญ์ ํ ๋ฐ์ดํฐ ์ถ๋ ฅ
}
printNodes(head); // ์ญ์ ํ ์ถ๋ ฅ
}
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
'์ปดํจํฐ๊ณผํ (CS) > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ์๋ก (0) | 2020.07.28 |
---|---|
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ์คํ, ํ, ๋ฑ (0) | 2020.07.19 |
[c++] ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ๊ณต๋ถ :: ์๋ฃ๊ตฌ์กฐ - ๋ฐฐ์ด, ๋ฌธ์์ด (0) | 2020.07.19 |
[c++] CAS ๊ตฌํ ๋ฐ ABA ๋ฌธ์ ํด๊ฒฐ :: mutex(spin lock)์์ ๋น๊ต (1) | 2020.07.02 |
[c++] ๋ฐฐ์ด ๋ฐ (STL) vector ์ด๊ธฐํ ๋ฐฉ๋ฒ ์ ๋ฆฌ (4) | 2020.04.13 |
Comment