본문 바로가기

Programming/Programming 알고리즘 연습

Stack 직접 구현하기(Java)

Stack이란?

  - 한 방향에서만 자료를 삽입, 삭제가 가능한 선형구조(LIFO - Last In First Out - 후입선출) 형태의 자료구조

  - push(삽입), pop(삭제)을 사용하여 데이터의 추가 및 삭제가 가능

 

코드 작성 방식

  1. 작성할 Stack의 크기를 입력받음

  2. 입력받은 크기만큼의 배열 생성

  3. 현재 위치를 표기할 index 변수 생성 후 -1로 초기화

  3. 반복문을 사용하여 사용자에게서 exit명령을 입력받을 때 까지 반복하여 명령 수행

  4. pop 명령 입력시 현재 배열의 인덱스값을 출력한 후, null로 초기화

    - Exception 발생시, 인덱스의 범위관련 예외이므로 StackUnderflow 발생 메시지 출력

  5. push 명령 입력시 현재 배열의 인덱스 값에 1을 더한 후 해당 위치에 입력값 추가

    - Exception 발생시, 인덱스의 범위관련 예외이므로 StackOverflow 발생 메시지 출력

 

소스코드

//Stack - LIFO(후입선출)구조로 되어있는 자료구조
package data_Structure;

import java.util.Arrays;
import java.util.Scanner;

public class Stack {

	public static void main(String[] args) {
		System.out.print("스택의 사이즈 : ");
		
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		String[] arrStack;
		int index = -1;
		
		try {
			arrStack = new String[Integer.parseInt(str)];
		} catch (Exception e) {
			System.out.println("잘못된 입력입니다.");
			scan.close();
			return;
		}
		
		while(!str.equals("exit")) {
			System.out.println("사용할 명령을 입력하시오(push, pop, exit)");
			str = scan.nextLine();
			
			if(str.equals("pop")) {
				try {
					pop(arrStack, index);
					index -= 1;
				} catch (Exception e) {
					System.err.println("StackUnderflow 발생!");
				}
				
			}else if(str.equals("push")){
				System.out.println("추가할 값을 입력하시오");
				str = scan.nextLine();
				
				try {
					index += 1;
					push(arrStack, str, index);
				} catch (Exception e) {
					index -= 1;
					System.err.println("StackOverflow 발생!");
				}
			}
		}
		
		scan.close();
		System.out.println("결과값 : " + Arrays.toString(arrStack));
	}
	
	//push - 입력연산
	private static String[] push(String[] arrStack, String str, int index) {
		arrStack[index] = str;
		System.out.println("push결과 : " + Arrays.toString(arrStack));
		return arrStack;
	}
	
	//pop - 출력연산
	private static String[] pop(String[] arrStack, int index) {
		String temp = arrStack[index];
		arrStack[index] = null;
		System.out.println("pop결과 값 : " + temp);
		System.out.println("stack에 남은 값 : " + Arrays.toString(arrStack));
		return arrStack;
	}

}