본문 바로가기
자바과정/과제물

(Java) 스택&큐 [예외처리]

by Parkej 2021. 2. 15.

Stack & Queue 예외처리

 - Overflow & Underflow 방지

 - 자료구조는 동적할당을 전제로 해야하지만 아래에 작성된 스택&큐는 예외처리만을 하기위해 정적으로 했다.

 

 

- Try catch 문 사용

// 값을 담을 배열
package dynamic;

public abstract class Memory {
	protected int[] arr;
	protected int cnt;
	
	public Memory() {
		arr = new int[5];
		cnt = 0;
	}
	
	public void push(int a) {
		arr[cnt++] = a;
	}
	public abstract int pop();
}


/// 스택
package dynamic;

public class MyStack extends Memory {
	@Override
	public int pop() {
		return arr[--cnt];
	}
}


/// 큐
package dynamic;

public class MyQueue extends Memory{
	private int front;

	public MyQueue() {
		front = 0;
	}

	@Override
	public int pop() {
		return arr[front++];
	}
}


 

- 메인에서의 예외처리 (Try Catch문 사용)

 > 예외는 예외처리(Exception Handling)을 통해 프로그램을 종료 되지 않고 정상적으로 작동되게 만들어줄 수 있다.

    자바에서 예외처리는 Try Catch문을 통해 해줄 수 있다.

/// 메인
package dynamic;
import java.util.Scanner;

public class DynamicMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		MyStack ms = new MyStack();
		MyQueue mq = new MyQueue();
		Memory mm = null;
		int a;
		while(true) {
			System.out.println("1. 스택 2. 큐 3. 종료");
			a = sc.nextInt();
			if(a==1) {mm = ms;}// 스택
			else if(a==2) {mm = mq;} // 큐
			else {break;}
			while(true) {
				System.out.print("1. push 2. pop 3. break : ");
				a = sc.nextInt();
				if(a==1) { // push
					System.out.print("push 값 입력 : ");
                    
                    ///// 예외처리 부분 //////
					try { 
						mm.push(sc.nextInt());						
					} catch (Exception e) {}
					/////////////////////////
                    
				}
				else if(a==2) {
					System.out.print("pop 값 : ");
                    
                    ///// 예외처리 부분 //////
					try {
						System.out.println(mm.pop());	
					} catch (Exception e) {}
					/////////////////////////
                    
				}
				else {
					break;
				}
			}
		}
	}
}

 

 

- 빈공간과 사이즈 함수를 구현하여 활용

// 배열
package dynamic;

public abstract class Memory {
	protected int[] arr;
	protected int cnt;

	public Memory() {
		arr = new int[5];
		cnt = 0;
	}

	public void push(int a) {
			arr[cnt++] = a;
		
	}
	public boolean sizeEmpty() { // 배열안에 값이 없을때 비교
		return cnt == 0;
	}
	
	public boolean sizeFull() { // 배열안에 값이 꽉 차 있을때 비교
		return cnt == 5;
	}
	public abstract int pop();

}



// 스택
package dynamic;

public class MyStack extends Memory {
	@Override
	public int pop() {
		return arr[--cnt];
	}
}



// 큐
package dynamic;

public class MyQueue extends Memory{
	private int front;

	public MyQueue() {
		front = 0;
	}

	@Override
	public int pop() {
		--cnt;
		if(front == 5) {
			front = 0;
		}
		return arr[front++];
	}
	
}



// 메인
package dynamic;
import java.util.Scanner;

public class DynamicMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		MyStack ms = new MyStack();
		MyQueue mq = new MyQueue();
		Memory mm = null;
		int a;
		while(true) {
			System.out.println("1. 스택 2. 큐 3. 종료");
			a = sc.nextInt();
			if(a==1) {mm = ms;}// 스택
			else if(a==2) {mm = mq;} // 큐
			else {break;}
			
			while(true) {
				System.out.print("1. push 2. pop 3. break : ");
				a = sc.nextInt();
				if(a==1) { // push
					if(mm.sizeFull()) { // 값이 가득 차 있을때
						System.out.println("더 이상 push 할 수 없습니다.");
					}
					else {
						System.out.print("push 값 입력 : ");
						mm.push(sc.nextInt());
					}
				}
				
				else if(a==2) {
					if(mm.sizeEmpty()) { // pop 할 값이 없을때
						System.out.println("더 이상 pop 할 수 없습니다.");
					}else {
						System.out.print("pop 값 : ");
						System.out.println(mm.pop());	
					}
				}
				
				else {
					break;
				}
				
			}
		}
	}
}

 

반응형

댓글