* 쉬움주의 *
https://www.acmicpc.net/problem/10828
백준저지에 등록되어있는 정말 간단한 스택만드는 문제이다.
그동안 코드짜면서 스택 또는 큐가 필요한 경우, 매번 새롭게 구현하여 사용했었는데, 라이브러리(STL)를 사용하는 법을 (부끄럽지만 이제서야) 해보았다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
사용법은 그저,
#include<stack> // 를 선언해준 뒤,
stack<변수타입> s; // 스택변수를 선언하고,
s.push(x) / s.pop() / s.top() 등등 기존 알려진 방식대로 사용하면 된다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
문제 10828번의 솔루션)
(1) stack STL 사용
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main() {
stack<int> stack; // int형 자료형을 사용하는 스택변수 선언
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
if (!s.compare("push")) {
int input;
cin >> input;
stack.push(input);
}
else if (!s.compare("top")) {
cout << (stack.empty() ? -1 : stack.top()) << '\n';
}
else if (!s.compare("size")) {
cout << stack.size() << '\n';
}
else if (!s.compare("empty")) {
cout << (stack.empty() ? 1 : 0) << '\n';
}
else if (!s.compare("pop")) {
cout << (stack.empty() ? -1 : stack.top()) << '\n';
if(!stack.empty()) stack.pop();
}
else {
cout << "invalid cmd" << '\n';
}
}
}
(2) STL을 사용하지 않은, 평소에 사용하던 코드(Node 구조체와 Stack 클래스 선언)
#include<iostream>
#include<string>
using namespace std;
struct Node {
int n;
Node* prev;
};
class Stack {
private:
int stackSize;
Node* stackTop;
public:
Stack();
void push(int x);
void pop();
void size();
void empty();
void top();
};
Stack::Stack() {
stackSize = 0;
stackTop = NULL;
}
void Stack::push(int x) {
Node* node = new Node;
node->n = x;
node->prev = stackTop;
stackTop = node;
stackSize++;
}
void Stack::pop() {
if (!stackSize) {
cout << -1 << '\n'; return;
}
cout << stackTop->n << '\n';
Node* temp = stackTop;
stackTop = stackTop->prev;
stackSize--;
delete temp;
}
void Stack::size() {
cout << (stackSize ? stackSize : 0) << '\n';
}
void Stack::empty() {
cout << (stackSize ? 0 : 1) << '\n';
}
void Stack::top() {
cout << (stackSize ? stackTop->n : -1) << '\n';
}
int main() {
Stack *stack = new Stack();
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
if (!s.compare("push")) {
int input;
cin >> input;
stack->push(input);
}
else if (!s.compare("top")) {
stack->top();
}
else if (!s.compare("size")) {
stack->size();
}
else if (!s.compare("empty")) {
stack->empty();
}
else if (!s.compare("pop")) {
stack->pop();
}
else {
cout << "invalid cmd" << '\n';
}
}
}