정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
https://www.acmicpc.net/problem/10828
스택을 노드와 포인터를 이용하여 구현해보았다.
- 노드클래스
- 스택클래스 본체
- push
스택에 처음 데이터를 넣을때는 prev, next 포인터가 각각 nullptr로 지정된다. (노드클래스 생성자 참고)
이미 데이터가 있던경우에는 기존 헤드포인터를 prevNode로 참조해둔뒤, 해드 노드로 새로만든노드를 지정하고, 이때 새로만든노드의 이전노드로 prevNode를, 또 prevNode의 다음노드를 새로만든노드인 헤드로 설정해준다.
- pop
헤드포인터가 가리키는 노드를 삭제할 노드로 지정한뒤, 해드노드를 재지정하였다.
- size / empty / top
- 입력받는부분
%s 로 문자열을 입력받은뒤, strcmp함수로 명령어들과 비교한뒤 필요한경우 정수는 %d로 받았다. 간단하다.
https://www.acmicpc.net/problem/10828
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
template <typename T>
class Node {
public:
T data= NULL;
Node<T> *next = nullptr, *prev = nullptr;
Node(T data
, Node<T> *prev = nullptr
, Node<T>* next = nullptr)
: data(data), prev(prev), next(next) {}
};
template <typename T>
class Stack {
private:
Node<T> *head = nullptr;
int dataSize = 0;
public:
Stack() {}
~Stack() {}
void push(const T data);
T pop();
int size() const;
bool empty() const;
T top() const;
};
template <typename T>
void Stack<T>::push(const T data) {
if (empty()) {
head = new Node<T>(data); //새로만든노드를 헤드로 지정
}
else {
Node<T> *prevNode = head;
head = new Node<T>(data, prevNode, nullptr);//새로만든노드를 헤드로 재지정
prevNode->next = head; //이전노드와 새로만든노드 연결
}
dataSize++;
}
template <typename T>
T Stack<T>::pop() {
if (empty()) {
return -1;
}
T data = top();
Node<T> *delNode = head;
head = head->prev;
delete delNode;
dataSize--;
return data;
}
template <typename T>
int Stack<T>::size() const {
return dataSize;
}
template <typename T>
bool Stack<T>::empty() const{
return dataSize == 0;
}
template <typename T>
T Stack<T>::top() const {
if (empty())
return -1;
return head->data;
}
int main(int n) {
scanf("%d", &n);
Stack<int> s;
while (n--) {
char c[6];
int num;
scanf("%s", c);
if (!strcmp(c, "push")) {
scanf("%d", &num);
s.push(num);
}
else if (!strcmp(c, "pop")) {
printf("%d\n", s.pop());
}
else if (!strcmp(c, "size")) {
printf("%d\n", s.size());
}
else if (!strcmp(c, "empty")) {
printf("%d\n", s.empty() ? 1 : 0);
}
else if (!strcmp(c, "top")) {
printf("%d\n", s.top());
}
}
return 0;
}