본문 바로가기
프로그래밍 언어/자바

[자바] 배열로 큐 구현하기

by 블루데이제이 2024. 5. 8.
728x90
반응형
자바에는 큐 클래스가 존재합니다만 배열로 큐를 구현해봤습니다.
package 패키지명

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

public class 클래스명 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayQueue queue = new ArrayQueue(5);	//큐에 담을 수 있는 최대개수는 5
		
		while(true) {
			System.out.println(String.format("현재 수: %d / %d", queue.size(), queue.capacity()));
			System.out.print("1. enq(add), 2.deq(poll), 3.peek, 4.clear, 5.dump, 0.종료 ");
			
			int num = sc.nextInt();
			if(num == 0) {
				System.exit(0);
				break;
			}
			
			int x;
			switch(num) {
			case 1:
				System.out.print("데이터 : ");
				x = sc.nextInt();
				queue.add(x);
				break;
			case 2:
				x = queue.poll();
				System.out.println("나간 데이터 :" + x);
				break;
			case 3:
				x = queue.peek();
				System.out.println("첫번째 데이터 :" + x);
				break;
			case 4:
				queue.clear();
				break;
			case 5:
				queue.dump();
				break;
			}
		}
	}
}

class ArrayQueue{
	private int max;	//큐의 최대용량
	private int front;	//첫 번째 요소의 커서
	private int rear;	//마지막 요소의 커서
	private int cnt;	//현재 데이터의 수
	private int[] queue;	//큐
	
	public ArrayQueue(int capacity){	//생성자
		this.max = capacity;
		this.cnt = this.front = this.rear = 0;
		
		try {
			this.queue = new int[this.max];
		}catch(Exception e) {
			this.max = 0;
		}
	}
	
	public int add(int x) {	//큐에 담기
		if(cnt >= max) {
			System.out.println("Queue if Full.");
			return x;
		}
		
		queue[rear++] = x; //추가시 rear를 증가시킨다.
		cnt++;
		if(rear == max) rear = 0; //rear는 최대값을 초과할 수 없으므로 최대값과 같으면 0으로 리셋한다.
		return x;
	}
	
	public int peek() { //맨 앞에 있는 숫자 가져오기
		if(cnt <= 0) {
			System.out.println("Queue is Empty");
		}
		
		return queue[front];
	}
	
	public int poll() {	//맨 앞에 있는 숫자 가져오기
		if(cnt <= 0) {
			System.out.println("Queue is Empty");
			return 0;
		}
		
		int x = queue[front++]; //맨 앞에 있는 숫자를 가져온 후 front를 증가시킨다.
		cnt--; //poll은 삭제의 개념이므로 개수를 줄인다.
		if(cnt < 0) cnt = 0;
		if(front == max) front = 0;	//front는 최대값을 초과할 수 없으므로 최대값과 같으면 0으로 리셋한다.
		return x;
	}
	
	public void clear() {
		this.rear = this.front = this.cnt = 0; //front, rear, cnt를 0으로 초기화
	}
	
	public boolean isEmpty() {		
		return this.cnt <= 0;
	}
	
	public int capacity() {
		return this.max;
	}
	
	public boolean isFull() {
		return this.cnt >= this.max;
	}
	
	public int size() {
		return this.cnt;
	}
	
	public void dump() {
		if(cnt <= 0) {
			System.out.println("Queue is Empty");
		}else {
			System.out.println(Arrays.toString(queue));
		}
	}
}
728x90
반응형