본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
C++

C++로 구현하는 자료구조!!!스택 편@@

by Hazard3_o00sung 2020. 11. 27.
728x90

강력한 언어, c++로 구현하는 자료구조

C++로 구현하는 Stack 자료구조

제 글을 보시게 되면, C 혹은 Python으로 구현한 스택자료구조를 보셨을 수도 있겠네요~ 물론 못 보셨다면 아래 링크 달아드릴테니 들어가셔서 간단하게 해보시는걸 추천드립니다~!

 

hazarddev.tistory.com/29

 

자료구조[1]-STACK(python)

자료구조[1]-STACK 본 포스트는 python언어로 작성되었음을 알려드립니다. 1. stack이란? https://hazarddev.tistory.com/17?category=794281 STACK(스택)이 뭔가요?[1] 본 포스트는 c언어를 중심으로 작성되었습..

hazarddev.tistory.com

hazarddev.tistory.com/17

 

STACK(스택)이 뭔가요?[1]

본 포스트는 c언어를 중심으로 작성되었습니다. STACK(스택)이 뭔가요? 스택.. 롤 하신분이라면 압니다. 필자 또한 롤을 즐겨했고, 요즘 롤은 참고로 전혀 몰라요. 근데 예전에 메자이 스택 아시겠

hazarddev.tistory.com

 

사실 어떤 언어로든 똑같은 자료구조를 만들 수 있어야 어느정도 언어에 대한 이해가 생겼다 라고 볼 수 있습니다! 문법은 달라도 사실 흐름 자체는 거의 비슷하다 볼 수 있으니까요~ 그럼 각설하고 클래스로 구현하는 스택 자료구조 부터 설명을 시작하도록 하겠습니다!

 

1. 클래스로 구현하는 스택 자료구조!

우선 C++로 스택을 구현하는 방법은 뭐 너무 많지만 대표적으로 클래스로 구현하는 방법 그리고 STL<Standard Template Library>라고 하는 강력한 자료구조, 알고리즘 등을 모아놓은 라이브러리입니다. 앞으로 포스팅하는 자료구조들은 클래스로 구현하는 방법과 STL을 이용한 방법 총 두가지로 나누어 설명할 예정입니다!

1.1 노드부 선언

클래스로 노드부를 선언해주어야 합니다. 그 이유에는 스택이라는 자료구조안에 들어가는 데이터가 객체여야 하기 때문인데요, 그럼 간단하게 생각해보았을 때 노드안에는 값을 담는 변수와, 그 다음 객체를 가리키는 노드 포인터가 들어가 있어야겠죠?

current value  next ->  nextNode value next -> ...

위와 같은 방식으로 구현할 예정입니다. 우선 코드를 보시겠습니다!

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
class Stack;
class Node{
    friend class Stack;
    private:
        int val;
        Node *next;
        Node(int value = 0, Node *newNode = nullptr)
        {val = value; next = newNode;}
};
cs

 

우선 아래 스택 객체를 전방선언해서 노드 클래스의 친구 클래스로 만들어, 스택 객체에서 노드 객체를 액세스할 수 있게 해야합니다. 또한 private한정자 내부에 선언된 데이터(정수)와 다음 노드를 가리키는 next노드 포인터 변수, 그리고 노드 객체를 초기화하는 생성자로 구성되어 있습니다! 혹시 C++가 익숙하지 못하신 분은 댓글 달아주시면 도와드리도록 하겠습니다!!

1-2.스택객체 선언

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Stack{
    private:
        Node *top;
    public:
        explicit Stack(){top = nullptr;}
        bool isEmpty()const;
        void pushStack(const int val);
        int *popStack(int &val);
        void show()const;
};
 
bool Stack::isEmpty() const{
    return top == nullptr;
}
 
void Stack::pushStack(const int val){
    top = new Node(val, top);
}
 
int *Stack::popStack(int &val){
    if(!isEmpty()) {
        std::cout << "Empty Stack" << std::endl;
        return 0;
    }
    Node *= top;
    val = top -> val;
    top = x -> next;
    delete x;
    return &val;
}
 
void Stack::show() const{
    Node *temp = top;
    while (temp != nullptr){
        std::cout << temp -> val << std::endl;
        temp = temp -> next;
    }
}
 
cs

 

스택 객체입니다. 후 길죠? ㅎㅎㅎㅎ 그래도 설명을 차근 차근 드리도록 하겠습니다!

우선 스택 자료구조에 대해 알고 계신다는 것을 가정하고 설명드리기에 top이라는 객체는 스택의 최상단 객체를 가리키는 변수 입니다. 그 이유로는 스택 객체에서 데이터는 마치 링크드 리스트로 구현되어 있는 것과 비슷하기 때문에 컨트롤 변수가 필요하기 때문입니다.

 

public 한정자 아래에 작성된 생성자와 스택 객체를 컨트롤할 수 있는 멤버 함수가 작성되어 있습니다. 

 

isEmpty() 함수는 12번째 줄에 구현되어 있습니다. top이 널포인터인지를 확인하며 불리언 값을 반환하는 간단한 함수이죠? 널포인터는 참고로 C언어에서의 NULL을 생각하시면 됩니다. 포인터 변수이기 때문에 널값이 대입된 포인터 변수라고 초기화한 것이죠~

 

pushStack(const int val) 를 보게되시면, 당연히 스택 내부로 값을 삽입하는 함수이죠. top을 새로운 노드로 선언해 값을 대입하고 top변수를 계속해서 그 다음 노드 포인터로 갖습니다. 그래야 다음 스택 객체가 삽입되어도, 순회할 수 있기 때문이죠

 

popStack(int &val) 을 보게되면, 첫번째 제어문에 isEmpty()함수를 호출해 빈 스택 객체인지 확인합니다. 당연히 비어있는데 객체를 빼준다는 것은 말이 안되니까 표준출력함수를 이용해 이미 비어있는 함수라는 것을 출력하며 0을 반환합니다. 빈 스택이 아닌 경우에는 새로운 노드 객체에 top을 복사합니다. 그 다음 delete키워드를 통해 삭제해 그 이전 노드가 top객체가 될 수 있게 하며, 삭제된 객체의 정수값을 반환하며 동작을 종료합니다.

 

show()const 는 temp변수가 top을 복사해 nullptr이 아닐 때 까지 순회하며 스택에 들어간 객체들의 값을 출력하며 프로그램의 동작을 종료합니다.

1-3.main()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int
main()
{
    Stack *stack = new Stack();
    stack -> pushStack(1);
    stack -> pushStack(2);
    stack -> pushStack(3);
    stack -> pushStack(4);
    stack -> pushStack(5);
    stack -> show();
}
 
RESULT >
5
4
3
2
1
cs

 

main함수에서 스택객체를 생성해 값을 넣은 다음 출력하는 프로그램입니다. 스택의 완성이죠! 출력은 아래대로 5,4,3,2,1 이렇게 정상적으로 출력된 것을 확인할 수 있으며, 여러분들도 코드를 작성해보시는 것을 추천드립니다!

 

2. STL로 구현하는 스택!

사실 이건 누군가 실력이 아주 좋은 누군가가 미리 정의한 자료구조를 사용하는 것이기 때문에 사용하기 너무 간단하고 쉽습니다. 이것은 코드로 설명을 하도록 하겠습니다!!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int
main()
{
    std::stack<int> newStack; // <---- <>사이에 스택에 들어갈 데이터의 타입을 선언
    newStack.push(1); // <----- push() 함수를 이용해 삽입
    newStack.push(2);
    newStack.push(3);
    newStack.push(4);
    newStack.push(5);
    while(!newStack.empty()){ // <---- empty() 내장함수를 사용해 스택객체가 비어있는 상태가 될 때까지 반복
        int temp = newStack.top(); // <----- top()내장함수를 통해 스택 객체의 최상단 객체를 가져옴
        std::cout << temp << std::endl
        newStack.pop();//<---- pop() 내장함수를 통해 제거
    }
    return 0;
}
 
RESULT >
5
4
3
2
1
cs

위 코드에 설명만 봐도 사용하기 쉽기 때문에 코드 내부에 주석으로 설명을 덧붙였습니다. 꼭 실습을 하셔야합니다!!! 한번 작성해보는 것은 백번 눈으로 보는것보다 좋으니까요ㅎㅎㅎ

 

C++을 이용해서 스택을 구현하는 방법을 알아보았는데요, 다음 글에서는 큐 구현하는 법에 대해서 글을 올릴 예정입니다!!!

 

hazarddev.tistory.com/38

 

C++로 구현하는 자료구조!!!큐(Queue)편@@@

C++ 로 구현하는 Queue 자료구조 스택 포스팅에 이어서 큐 관련해서 업로드 이어나가도록 하겠습니다~ 큐 또한 스택과 동일하게 STL안에 정의되어 있기 때문에 간단하게 쓸 수 있지만, 그래도 직접

hazarddev.tistory.com

 

댓글로 피드백, 문의 환영합니다

728x90

댓글