https://www.acmicpc.net/problem/28278
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
3: 스택에 들어있는 정수의 개수를 출력한다.
4: 스택이 비어있으면 1, 아니면 0을 출력한다.
5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
입력
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)
둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.
출력을 요구하는 명령은 하나 이상 주어진다.
풀이과정
명령에 따른 메서드를 모두 구현한다음 명령 번호에 따라 맞는 메서드를 호출하고자 하였다. 그리고, 명렁의 수는 1000000만큼이니 스택의 공간도 1000000만큼 할당해주었다.
public class Main {
static int[] stack = new int[1000000];
static int nowIndex = -1;
//1번 명령
public static void push( int x ){
stack[++nowIndex] = x;
}
//2번 명령
public static int pop(){
if( nowIndex == -1 )
return -1;
return stack[nowIndex--];
}
//3번 명령
public static int size(){
if( nowIndex == -1 )
return 0;
return nowIndex + 1;
}
//4번 명령
public static int isEmpty(){
if( nowIndex == -1 )
return 1;
else
return 0;
}
//5번 명령
public static int read(){
if( nowIndex == -1 )
return -1;
else
return stack[nowIndex];
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st ;
int N = Integer.parseInt(br.readLine());
for( int i = 0; i < N; i++ ){
// 공백을 포함한 문자열이 존재하므로
// StringTokenizer 사용
st = new StringTokenizer(br.readLine()," ");
int older = Integer.parseInt(st.nextToken());
switch (older){
// 1번 명령일 경우 st.nextToken 사용으로 인자 넘겨줌
case 1:
push(Integer.parseInt(st.nextToken()));
break;
case 2:
sb.append(pop()).append("\n");
break;
case 3:
sb.append(size()).append("\n");
break;
case 4:
sb.append(isEmpty()).append("\n");
break;
case 5:
sb.append(read()).append("\n");
break;
}
}
System.out.println(sb);
}
StringTokenizer를 사용한 이유는 1번 명령이 입력으로 들어올 경우 공백을 포함하고 정수 X가 들어오기 때문이다.
push(Integer.parseInt(st.nextToken()));
구문으로 정수 X를 push할 수 있다.