[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…๊ณต๋ถ€ :: ์ž๋ฃŒ๊ตฌ์กฐ - ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ

  1. ๋ฆฌ์ŠคํŠธ๋ž€?
  2. ์ •์˜
  3. ๋ฐฐ์—ด๊ณผ์˜ ๋น„๊ต
  4. ์—ฐ์‚ฐ
    1. ์‚ฝ์ž…
    2. ์‚ญ์ œ
    3. ์ ‘๊ทผ
  5. ์ข…๋ฅ˜ / ๊ตฌํ˜„

 

๋ฆฌ์ŠคํŠธ๋ž€?

๋ฆฌ์ŠคํŠธ๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ๋“ค์˜ ๋ชจ์ž„์ด๋‹ค. ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ 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); // ์‚ญ์ œ ํ›„ ์ถœ๋ ฅ

}
  • ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
๋ฐ˜์‘ํ˜•