코딩테스트/Java

[BaekJoon][자료구조][Java] Stack 구현하기

프린이8549 2024. 8. 10. 16:49

Stack은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)로 데이터를 저장하는 형식을 말한다.

 

주어진 N(2<= N <=100)개의 수를 순서대로 Stack에 넣은 후 하나씩 꺼내 화면에 출력하시오.

 

입력

2
5
1 2 3 4 5
5 4 2 3 1

 

출력

#1 5 4 3 2 1
#2 1 3 2 4 5

 

package BOJ;

import java.io.*;
import java.util.StringTokenizer;

public class MyStack{
	private static int[] stack;
    private static int pointer;
    
    // 스택 초기화
    public static void init(int size){
    	stack = new int[size];
        pointer = 0;
    }
    
    // 스택이 가득 찼는지 확인
    public static boolean stackIsFull(){
    	return pointer == stack.length;
    }
    
    // 스택이 비어 있는지 확인
    public static boolean stackIsEmpty(){
    	return pointer == 0;
    }
    
    // 스택에 값 추가
    public static boolean stackPush(int value){
    	// 스택이 가득 차있다면 false
        if(stackIsFull()){
        	return false;
        }
        // 아니라면 가장 뒤에 넣기
        // ++pointer 해버리면 ArrayIndexOutOfBoundsException
        stack[pointer++] = value;
        return true;
    }
    
    // 스택에서 값 추출
    public static Integer stackPop(){
    	// 스택이 비어있다면 nullPointException 나기에 null 반환하여 처리
        if(stackIsEmpty()) return null;
        // 비어 있지 않다면 --pointer 인덱스의 값을 반환하도록 함
        // pointer-- 해버리면 마찬가지로 ArrayIndexOutOfBoundsException
        return stack[--pointer];
    }
    
    public static void main(String[] args) throws IOException{ // 스트림 예외 처리
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // 테스트 케이스 수
        int T = Integer.parseInt(br.readLine());
        // 스택의 크기
        int size = Integer.parseInt(br.readLine());
        // 스택 초기화
        init(size);
        // 결과 담을 빌더 선언
        StringBuilder sb = new StringBuilder();
        // 테스트 케이스
        for(int testcase = 1; testcase <= T; testcase++){
        	 sb.append("#").append(testcase).append(" ");
        	 StringTokenizer st = new StringTokenizer(br.readLine());
             for(int i = 0; i < stack.length; i++){
             	stackPush(Integer.parseInt(st.nextToken()));
             }
             while(!stackIsEmpty()){
             	sb.append(stackPop()).append(" ");
             }
             sb.append("\n");
        }
        // StringBuilder 출력 및 스트림 닫기
        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }
}