import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
ArrayList<Integer> stack = new ArrayList<>();
int cnt = Integer.parseInt(br.readLine());
for (int i = 0; i < cnt; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
while (st.hasMoreTokens()) {
String order = st.nextToken();
switch (order) {
case "push" :
stack.add(Integer.parseInt(st.nextToken()));
break;
case "pop" :
if(stack.isEmpty()) {
bw.write("-1\n");
} else {
bw.write(stack.get(stack.size() - 1) + "\n");
stack.remove(stack.size() - 1);
}
break;
case "size" :
bw.write(stack.size() + "\n");
break;
case "empty":
bw.write(stack.isEmpty() ? "1\n" : "0\n");
break;
case "top":
bw.write(stack.isEmpty() ? "-1\n" : stack.get(stack.size() - 1) + "\n");
break;
}
}
}
bw.flush();
bw.close();
br.close();
}
}
순서대로 저장되면 된다는 생각에 List중에서, 처음에는 LinkedList를 사용했다가 (한 번 써보고 싶었다) ArrayList로 바꿨다. LinkedList는 ArrayList에 비해 삽입, 삭제는 빠르지만 탐색은 느리다. 문제를 보면 탐색이 더 빠른 ArrayList가 적절한 것 같아서 바꿨다.
둘다 해봤는데 이런 간단한 내용 출력에 시간 차이가 크게 난다. bw가 훨씬 성능이 좋다.
문제를 풀고 나서 Stack이라는 클래스가 있는걸 처음 알았다.
자료형만 ArrayList에서 Stack으로 바꿨는데 메소드를 모두 그대로 사용 가능했다.
찾아보니 둘 다 List를 기반으로 한 자료 구조라고 한다.
스트링빌더로 출력할 내용을 append로 붙인 다음 맨 마지막에 한 번에 출력할 수 있다.
학원 다녔을 때 선생님이 구현과 출력 부분을 분리하라고 했던 기억이 났다