알고리즘

백준 10828번 스택 구현

이온시옥 2019. 1. 3. 21:48
반응형





노드를 관리하는 NodeData 클래스

Stack을 관리하는 Stack 클래스

그리고 string 관련 입력을 stack 객체와 연결시켜주는 main함수로 구성이 됨.


NodeData 클래스를 만드는 이유는?

굳이 이 문제에서는 한번에 Stack안에서 처리해도 상관은 없지만 캡슐화를 위해서 일부러 빼둠.

혹시나 나중에 int형이 아닌 다른 데이터를 처리한다면? Stack을 모조리 바꿔야한다... 하지만 데이터관련 노드를 따로 클래스로 빼두면 NodeData클래스만 수정하여 사용이 가능.


//

//  main.cpp

//  algorithm

//

//  Created by Eon on 12/27/18.

//  Copyright © 2018 Eon. All rights reserved.

//


#include <iostream>

#include <cstring>


using namespace std;


class NodeData {

private:

    int number; //숫자를 저장하는 변수

    NodeData* down; //밑에 노드를 포인팅

    

public:

    NodeData(int num) : number(num), down(NULL) { } //이니셔라이져를 통한 맴버변수 초기화.

    

    void setNumber(int value) {

        number = value;

    }

    void setdown(NodeData* value) {

        down = value;

    }

    int getNumber() {

        return number;

    }

    NodeData* getdown() {

        return down;

    }

};




class Stack {

private:

    NodeData *top;

    int size;

public:

    Stack() : top(NULL), size(0)  { } //이니셔라이져를 통한 맴버변수 초기화.

    ~Stack() {

        if (top) {

            NodeData* temp = top;

            NodeData* temp2;

            while(temp->getdown()) {

                temp2 = temp;

                temp = temp->getdown();

                delete temp2;

            }

        }

    }

    

    void push(int num) {

        NodeData* value = new NodeData(num);

        if (isEmpty()) {

            top = value;

        }

        else {

            value->setdown(top);

            top = value;

        }

        size ++;

    }

    

    int pop() {

        if (!isEmpty()) {

            NodeData* temp = top;

            

            if(top->getdown()) {

                top = temp->getdown();

            }

            else {

                top = NULL;

            }

            int number = temp->getNumber();

            delete temp;

            size --;

            return number;

        }

        return -1;

    }

    

    int getSize() {

        return size;

    }

    

    int isEmpty() {

        if (!top) {

            return true;

        }

        return false;

    }

    

    int getTopNumber() {

        if (top) {

            return top->getNumber();

        }

        return -1;

    }

};


int main(void) {

    Stack stack;

    int num;

    cin >> num;

    cin.ignore();

    

    char inp[100];

    for (int i=0; i<num; i++) { //loop by first number.

        cin.getline(inp, 100, '\n'); //get string from user.

        

        if (const char* first = strtok(inp, " ")) {

            if (strcmp(first, "push") == 0) {

                if(const char* second = strtok(NULL, " ")) {

                    int num = atoi(second);

                    stack.push(num);

                }

                else {

                    continue;

                }

            }

            else if (strcmp(first, "pop") == 0) {

                cout << stack.pop() << endl;

            }

            else if (strcmp(first, "size") == 0) {

                cout << stack.getSize() << endl;

            }

            else if (strcmp(first, "empty") == 0) {

                if (stack.isEmpty()) {

                    cout << 1 << endl;

                }

                else {

                    cout << 0 << endl;

                }

            }

            else if (strcmp(first, "top") == 0) {

                cout << stack.getTopNumber() << endl;

            }

            else {

                continue;

            }

        }

    }

    return 0;

}





반응형