백준 10828번 스택 구현
노드를 관리하는 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;
}