Code IT/Data-Structure

[자료구조] Circular Queue 원형 큐

2021. 4. 3. 02:47

front와 rear 설정 시 % 해줘야 하는 것 말고는 무난 !

import java.io.*;

public class CircularQueue {

	private int[] key;
	// 원형 큐이므로 이후 연산에 front나 rear 값 설정 시 % cq.max_qsize 해줘야 함.
	private int front;
	private int rear;
	private int qsize;
	private int max_qsize;

	public CircularQueue() {
		front = 0;
		rear = 0;
		qsize = 0;
		max_qsize = 0;
	}

	public static CircularQueue CreateCircularQ(int max) { // 큐 생성
		CircularQueue cq = new CircularQueue();
		cq.key = new int[max];
		cq.max_qsize = max;
		System.out.println("Queue created, max size: " + cq.max_qsize);
		return cq;
	}

	public static boolean IsEmpty(CircularQueue cq) {
		if (cq.qsize == 0) {
			return true;
		}
		return false;
	}

	public static boolean IsFull(CircularQueue cq) {
		if (cq.qsize == cq.max_qsize) {
			return true;
		}
		return false;
	}

	public static void Dequeue(CircularQueue cq) { // front 에서 delete
		if (IsEmpty(cq)) {
			System.out.println("Not Deleted : queue is empty.");
		} else {
			System.out.println("Deleted : " + cq.key[cq.front]);
			cq.front = (cq.front++) % cq.max_qsize;
			cq.qsize--;
		}
	}

	public static void Enqueue(CircularQueue cq, int num) {
		if (IsFull(cq)) {
			System.out.println("Not Inserted : queue is full.");
		} else {
			cq.key[cq.qsize++] = num;
			cq.rear = (cq.qsize - 1) % cq.max_qsize;
			System.out.println("Inserted : " + cq.key[cq.rear]);
		}
	}

	public static void PrintFirst(CircularQueue cq) {
		System.out.println("front 위치 : " + cq.front % cq.max_qsize + ", 값 : " + cq.key[cq.front % cq.max_qsize]);
	}

	public static void PrintRear(CircularQueue cq) {
		System.out.println("rear 위치 : " + cq.rear % cq.max_qsize + ", 값 : " + cq.key[cq.rear % cq.max_qsize]);
	}

	void MakeEmpty(CircularQueue cq) {
		cq.front = 0;
		cq.rear = 0;
		cq.qsize = 0;
		cq.max_qsize = 0;

	}

	public static void main(String[] args) throws IOException {
		CircularQueue queue = new CircularQueue();
		BufferedReader br = new BufferedReader(new FileReader("qexpr_input.txt"));
		String str;

		while ((str = br.readLine()) != null) {
			String[] arr = str.split(" ");

			if (arr[0].equals("e")) {
				Enqueue(queue, Integer.parseInt(arr[1]));
			} else if (arr[0].equals("d")) {
				Dequeue(queue);
			} else if (arr[0].equals("f")) {
				PrintFirst(queue);
			} else if (arr[0].equals("r")) {
				PrintRear(queue);
			} else if (arr[0].equals("n")) {
				queue = CreateCircularQ(Integer.parseInt(arr[1]));
			} else
				System.out.println("Error");

		}

		br.close();

	}
}