본문 바로가기

자료구조

Stack

Stack 전체 구조

Stack은 FIFO(First In First Out) 선입선출 구조를 가지고 있으며 바닥부터 데이터를 넣어서 데이터를 넣은 역순으로 데이터를 꺼냅니다.

Node

template <typename T>
class Node { // 노드 클래스
public:
    Node<T>* m_Next;
    T m_Data;
public:
    Node() {
        m_Next = nullptr;
    };
    Node(const T& data) {
        m_Data = data;
        m_Next = nullptr;
    };
    ~Node() {
        m_Next = nullptr;
    }
};

Node<T>* m_Next 변수는 다음으로 가는 변수의 주소를 담고 있습니다. 즉 위에서 부터 데이터를 꺼내므로 자신의 아래에있는 Node의 주소를 가르키며 T m_Data 변수는 데이터 값을 가지고 있습니다.

Stack

private:
    Node<T>* m_Top;

public:
    Stack() {
        m_Top = nullptr;
    }
    ~Stack() {
        Node<T>* nodeMove = m_Top;
        while (nodeMove != nullptr) {
            Node<T>* temp = nodeMove;
            nodeMove = nodeMove->m_Next;
            delete temp;
        }
    }

멤버 변수로는 가장 위에있는 Node* 변수 하나만 가집니다. 생성자로 초기 데이터는 null로 하며 소멸자에서는 쌓여져 있던 stack의 모든 Node를 메모리 해제합니다.

데이터 push

 void push(T data) {
        Node<T>* newNode = new Node<T>(data);
        newNode->m_Next = m_Top;
        m_Top = newNode;
    }

새로운 노드를 생성 해 매개변수로 받은 데이터를 넣어 둔 변수 newNode를 m_Next 주소를 현재 m_Top으로 한 후 m_Top 값을 newNode로 합니다

데이터 pop

 T pop() {
        // 스택이 비었을때
        if (m_Top == nullptr) {
            throw runtime_error("스택의 값이 비었습니다");
        }
        else {
            T topData = m_Top->m_Data;
            Node<T>* temp = m_Top;
            m_Top = m_Top->m_Next;
            delete temp;
            return topData;
        }
    }

m_Top 변수에 m_Top 변수의 다음 노드를 가르키는 값을 저장하고 기존 m_Top 변수의 값을 담은 새로운 Node를 만들어서 리턴합니다.

데이터 top

 T top() {
        if (m_Top == nullptr) {
            throw runtime_error("스택의 값이 비었습니다");
        }
        else {
            return m_Top->m_Data;
        }
    }

가장 위에있는 Node의 데이터를 꺼내서 리턴 합니다.

데이터 print

void print() {
        Node<T>* moveNode = m_Top;
        cout << "stack 데이터 출력" << endl;
        while (moveNode != nullptr) {
            cout << moveNode->m_Data << " ";
            moveNode = moveNode->m_Next;
        }
        cout << endl;
    }

가장 위에서 부터 m_Next로 이동하면서 하나씩 데이터를 출력합니다.

'자료구조' 카테고리의 다른 글

Queue  (0) 2024.06.09
Binary Tree  (0) 2024.06.07
Double Linked List  (0) 2024.06.01
Linked List  (0) 2024.05.28