큐(queue)
스택과 마찬가지로 데이터를 일시적으로 쌓아 놓는 자료구조로, 가장 먼저 넣은 데이터를 가장 먼저 꺼내는 선입선출(FIFO, First In First Out)
큐에 데이터를 넣는 작업 인큐(en-queue), 데이터를 꺼내는 작업 디큐(de-queue)
int형 고정 길이 큐(링 버퍼 사용하지 않고 구현)
package ch04_2;
// int형 고정 길이 큐(링 버퍼 사용하지 않고 구현)
public class IntArrayQueue {
private int[] que; // 큐용 배열
private int capacity; // 큐 용량
private int num; // 현재 데이터 개수
// 실행 시 예외 - 큐가 비어있음
public class EmptyIntArrayQueueException extends RuntimeException {
public EmptyIntArrayQueueException() {
}
}
// 실행 시 예외 - 큐가 가득 참
public class OverflowIntArrayQueueException extends RuntimeException {
public OverflowIntArrayQueueException() {
}
}
// 생성자
public IntArrayQueue(int maxlen) {
num = 0;
capacity = maxlen;
try {
que = new int[capacity]; // 큐 본체용 배열 생성
} catch (OutOfMemoryError error) { // 생성할 수 없음
capacity = 0;
}
}
// 큐에 데이터를 인큐
public int enque(int x) throws OverflowIntArrayQueueException {
if (num >= capacity) throw new OverflowIntArrayQueueException(); // 큐가 가득참
que[num++] = x;
return x;
}
// 큐에 데이터를 디큐
public int deque() throws EmptyIntArrayQueueException {
if (num <= 0) throw new EmptyIntArrayQueueException(); // 큐가 비어있음
int x = que[0];
for (int i = 0; i < num - 1; i++) {
que[i] = que[i + 1];
}
num--;
return x;
}
// 큐에서 데이터를 피크(맨앞 데이터 들여다봄)
public int peek() throws EmptyIntArrayQueueException {
if (num <= 0) throw new EmptyIntArrayQueueException(); // 큐가 비어있음
return que[num - 1];
}
// 큐에서 x를 검색하여 인덱스(없으면 -1) 반환
public int indexOf(int x) {
for (int i = 0; i < num; i++) {
if (que[i] == x) return i; // 검색 성공
}
return -1; // 검색 실패
}
// 큐 비우기
public void clear() {
num = 0;
}
// 큐 용량 반환
public int capacity() {
return capacity;
}
// 큐에 쌓여있는 데이터수 반환
public int size() {
return num;
}
// 큐가 비어 있는가
public boolean isEmpty() {
return num <= 0;
}
// 큐가 가득 찼는가
public boolean isFull() {
return num >= capacity;
}
// 큐 안의 모든 데이터를 맨앞부터 끝까지 순서대로 출력
public void dump() {
if (num <= 0) {
System.out.println("큐가 비어 있습니다.");
} else {
for (int i = 0; i < num; i++) {
System.out.print(que[i] + " ");
}
System.out.println();
}
}
}
int형 고정 길이 큐(링 버퍼를 사용하지 않고 구현)의 사용 예
package ch04_2;
import java.util.Scanner;
// int형 고정 길이 큐(링 버퍼를 사용하지 않고 구현)의 사용 예
public class Ex01_intArrayQueueTester {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
IntArrayQueue s = new IntArrayQueue(64); // 최대 64개를 푸시할 수 있는 큐
while (true) {
System.out.println("현재 데이터 개수: " + s.size() + " / " + s.capacity());
System.out.print("(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: ");
int menu = scanner.nextInt();
if(menu == 0) break;
int x = 0;
switch (menu) {
case 1 -> { // 인큐
System.out.print("데이터: ");
x = scanner.nextInt();
try {
s.enque(x);
} catch (IntArrayQueue.OverflowIntArrayQueueException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 2 -> { // 디큐
try {
x = s.deque();
System.out.println("디큐한 데이터는 " + x + "입니다.");
} catch (IntArrayQueue.EmptyIntArrayQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 3 -> { // 피크
try {
x = s.peek();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (IntArrayQueue.EmptyIntArrayQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 4 -> { // 덤프
s.dump();
}
}
}
}
}
/*
현재 데이터 개수: 0 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 1
데이터: 10
현재 데이터 개수: 1 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 1
데이터: 5
현재 데이터 개수: 2 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 1
데이터: 92
현재 데이터 개수: 3 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 2
디큐한 데이터는 10입니다.
현재 데이터 개수: 2 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 3
피크한 데이터는 92입니다.
현재 데이터 개수: 2 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (0) 종료: 4
5 92
*/
int형 고정 길이 큐
package ch04_2;
// int형 고정 길이 큐
public class IntQueue {
private int[] que; // 큐용 배열
private int capacity; // 큐의 용량
private int front; // 맨 앞의 요소 커서
private int rear; // 맨 뒤의 요소 커서
private int num; // 현재 데이터 개수
// 실행시 예외 - 큐가 비어 있음
public class EmptyIntQueueException extends RuntimeException {
public EmptyIntQueueException() {
}
}
// 실행시 예외 - 큐가 가득 참
public class OverflowIntQueueException extends RuntimeException {
public OverflowIntQueueException() {
}
}
// 생성자
public IntQueue(int maxlen) {
num = front = rear = 0;
capacity = maxlen;
try {
que = new int[capacity]; // 큐 본체용 배열 생성
} catch (OutOfMemoryError e) { // 생성할 수 없음
capacity = 0;
}
}
// 큐에 데이터를 인큐
public int enque(int x) throws OverflowIntQueueException {
if (num >= capacity) throw new OverflowIntQueueException(); // 큐가 가득 참
que[rear++] = x;
num++;
if (rear == capacity) {
// 배열 용량(마지막 인덱스)과 같아지면 첫 인덱스로 변경
rear = 0;
}
return x;
}
// 큐에 데이터를 디큐
public int deque() throws EmptyIntQueueException {
if (num <= 0) throw new EmptyIntQueueException(); // 큐가 비어 있음
int x = que[front++];
num--;
if (front == capacity) {
// 배열 용량(마지막 인덱스)과 같아지면 첫 인덱스로 변경
front = 0;
}
return x;
}
// 큐 데이터 피크(프런트 데이터 들여다봄)
public int peek() throws EmptyIntQueueException {
if (num <= 0) throw new EmptyIntQueueException(); // 큐가 비어 있음
return que[front];
}
// 큐를 비움
public void clear() {
num = front = rear = 0;
}
// 큐에서 x 검색하여 인덱스(없으면 -1) 반환
public int indexOf(int x) {
for (int i = 0; i < num; i++) {
int idx = (i + front) % capacity;
if (que[idx] == x) return idx; // 검색 성공
}
return -1; // 검색 실패
}
// 큐 용량 반환
public int getCapacity() {
return capacity;
}
// 큐 데이터 개수 반환
public int size() {
return num;
}
// 큐가 비어 있는가
public boolean isEmpty() {
return num <= 0;
}
// 큐가 가득 찼는가
public boolean isFull() {
return num >= capacity;
}
// 큐 안의 모든 데이터를 프런트->리어 순으로 출력
public void dump() {
if (num <= 0) {
System.out.println("큐가 비어 있습니다.");
} else {
for (int i = 0; i < num; i++) {
System.out.print(que[(i + front) % capacity] + " ");
}
System.out.println();
}
}
}
int형 고정 길이 큐의 사용 예
package ch04_2;
import java.util.Scanner;
// int형 고정 길이 큐의 사용 예
public class Ex02_intQueueTester {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
IntQueue s = new IntQueue(64); // 최데 64개를 인큐할 수 있는 큐
while (true) {
System.out.println();
System.out.printf("현재 데이터 개수: %d / %d\\n", s.size(), s.getCapacity());
System.out.print("(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: ");
int menu = scanner.nextInt();
if (menu == 0) break;
int x;
switch (menu) {
case 1 -> { // 인큐
System.out.print("데이터: ");
x = scanner.nextInt();
try {
s.enque(x);
} catch (IntQueue.OverflowIntQueueException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 2 -> { // 디큐
try {
x = s.deque();
System.out.println("디큐한 데이터는 " + x + "입니다.");
} catch (IntQueue.EmptyIntQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 3 -> { // 피크
try {
x = s.peek();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (IntQueue.EmptyIntQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 4 -> { // 덤프
s.dump();
}
}
}
}
}
/*
현재 데이터 개수: 0 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: 1
데이터: 1
현재 데이터 개수: 1 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: 1
데이터: 2
현재 데이터 개수: 2 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: 4
1 2
현재 데이터 개수: 2 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: 2
디큐한 데이터는 1입니다.
현재 데이터 개수: 1 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (0)종료: 3
피크한 데이터는 2입니다.
*/
int형 고정 길이 큐(메서드 search 추가)
// 큐에서 x 검색하여 맨앞에서 몇번째(없으면 0)인지 반환
public int search(int x) {
for (int i = 0; i < num; i++) {
if (que[(i + front) % capacity] == x) {
return i + 1; // 검색 성공
}
}
return 0; // 검색 실패
}
int형 고정 길이 큐의 사용 예(메서드 search 추가)
package ch04_2;
import java.util.Scanner;
// int형 고정 길이 큐의 사용 예(메서드 search 추가)
public class Ex03_intQueueTester2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
IntQueue2 s = new IntQueue2(64); // 최데 64개를 인큐할 수 있는 큐
while (true) {
System.out.println();
System.out.printf("현재 데이터 개수: %d / %d\\n", s.size(), s.getCapacity());
System.out.print("(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: ");
int menu = scanner.nextInt();
if (menu == 0) break;
int x;
switch (menu) {
case 1 -> { // 인큐
System.out.print("데이터: ");
x = scanner.nextInt();
try {
s.enque(x);
} catch (IntQueue.OverflowIntQueueException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 2 -> { // 디큐
try {
x = s.deque();
System.out.println("디큐한 데이터는 " + x + "입니다.");
} catch (IntQueue.EmptyIntQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 3 -> { // 피크
try {
x = s.peek();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (IntQueue.EmptyIntQueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 4 -> { // 덤프
s.dump();
}
case 5 -> { // 검색
System.out.print("데이터: ");
x = scanner.nextInt();
int n = s.search(x);
if(n != 0) {
System.out.printf("%d번째 데이터로 인덱스%d의 위치에 저장되어 있습니다.\\n", n, s.indexOf(x));
} else {
System.out.println("그 데이터는 등록되어 있지 않습니다.");
}
}
}
}
}
}
/*
현재 데이터 개수: 0 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 1
데이터: 1
현재 데이터 개수: 1 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 1
데이터: 6
현재 데이터 개수: 2 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 1
데이터: 9
현재 데이터 개수: 3 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 4
1 6 9
현재 데이터 개수: 3 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 2
디큐한 데이터는 1입니다.
현재 데이터 개수: 2 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 3
피크한 데이터는 6입니다.
현재 데이터 개수: 2 / 64
(1)인큐 (2)디큐 (3)피크 (4)덤프 (5)검색 (0)종료: 5
데이터: 9
2번째 데이터로 인덱스2의 위치에 저장되어 있습니다.
*/
제네릭 큐
package ch04_2;
// 제네릭 큐
public class Queue<E> {
// 실행 시 예외 - 큐가 비어 있음
public static class EmptyGqueueException extends RuntimeException {
public EmptyGqueueException() {}
}
// 실행 시 예외 - 큐가 가득 참
public static class OverflowGqueueException extends RuntimeException {
public OverflowGqueueException() {}
}
private E[] que; // 큐 본체
private int capacity; // 큐 용량
private int num; // 현재 데이터 개수
private int front; // 맨앞 요소 커서
private int rear; // 맨끝 요소 커서
// 생성자
public Queue(int maxlen) {
num = front = rear = 0;
capacity = maxlen;
try {
que = (E[]) new Object[capacity]; // 큐 본체용 배열 생성
} catch (OutOfMemoryError e) { // 생성할 수 없음
capacity = 0;
}
}
// 큐에 데이터를 인큐
public E enque(E x) throws OverflowGqueueException {
if(num >= capacity) throw new OverflowGqueueException(); // 큐가 가득 참
que[rear++] = x;
num ++;
if(rear == capacity) rear = 0;
return x;
}
// 큐에서 데이터를 디큐
public E deque() throws EmptyGqueueException {
if(num <= 0) throw new EmptyGqueueException(); // 큐가 비어 있음
E x = que[front++];
num--;
if(front == capacity) front = 0;
return x;
}
// 큐에서 데이터 피크(맨 앞 데이터 들여다봄)
public E peek() throws EmptyGqueueException {
if(num <= 0) throw new EmptyGqueueException(); // 큐가 비어 있음
return que[front];
}
// 큐에서 x 검색하여 인덱스(없으면 -1) 반환
public int indexOf(E x) {
for (int i = 0; i < num; i++) {
if (que[(i + front) % capacity].equals(x)) {
return (i + front) % capacity; // 검색 성공
}
}
return -1; // 검색 실패
}
// 큐에서 x 검색하여 맨앞에서 몇번째인지(없으면 -1) 반환
public int search(E x) {
for (int i = 0; i < num; i++) {
if(que[(i + front) % capacity].equals(x)) {
return i + 1; // 검색 성공
}
}
return -1; // 검섹 실패
}
// 큐 비우기
public void clear() {
num = front = rear = 0;
}
// 큐 용량 반환
public int getCapacity() {
return capacity;
}
// 큐 데이터 수 반환
public int size() {
return num;
}
// 큐가 비어 있는가
public boolean isEmpty() {
return num <= 0;
}
// 큐가 가득 찼는가
public boolean isFull() {
return num >= capacity;
}
// 큐의 모든 데이터를 맨앞부터 맨끝까지 출력
public void dump() {
if(num <= 0) {
System.out.println("큐가 비어 있습니다.");
} else {
for (int i = 0; i < num; i++) {
System.out.print(que[(i + front) % capacity].toString() + " ");
}
System.out.println();
}
}
}
제네릭 큐 테스트 프로그램
package ch04_2;
import java.util.Scanner;
// 제네릭 큐 테스트 프로그램
public class Ex04_queueTester {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Queue<String> s = new Queue<>(64); // 최대 64개 넣을 수 있는 큐
while (true) {
System.out.printf("현재 데이터 개수: %d / %d\\n", s.size(), s.getCapacity());
System.out.print("(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : ");
int menu = scanner.nextInt();
if(menu == 0) break;
int idx;
String x;
switch (menu) {
case 1 -> { // 인큐
System.out.print("데이터: ");
x = scanner.next();
try {
s.enque(x);
} catch (Queue.OverflowGqueueException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 2 -> { // 디큐
try {
x = s.deque();
System.out.println("디큐한 데이터는 " + x + "입니다.");
}catch (Queue.EmptyGqueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 3 -> { // 피크
try {
x = s.peek();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (Queue.EmptyGqueueException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 4 -> { // 덤프
s.dump();
}
case 5 -> { // 검색
System.out.print("데이터: ");
String str = scanner.next();
int n = s.search(str);
if(n != 0) {
System.out.printf("%d번째 데이터로, 인덱스 %d의 위치에 저장되어 있습니다.\\n", n, s.indexOf(str));
} else {
System.out.println("그 데이터는 등록되어 있지 않습니다.");
}
}
}
}
}
}
/*
현재 데이터 개수: 0 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 1
데이터: Q
현재 데이터 개수: 1 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 1
데이터: W
현재 데이터 개수: 2 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 1
데이터: E
현재 데이터 개수: 3 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 1
데이터: R
현재 데이터 개수: 4 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 3
피크한 데이터는 Q입니다.
현재 데이터 개수: 4 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 2
디큐한 데이터는 Q입니다.
현재 데이터 개수: 3 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 4
W E R
현재 데이터 개수: 3 / 64
(1) 인큐 (2) 디큐 (3) 피크 (4) 덤프 (5) 검색 (0) 종료 : 5
데이터: E
2번째 데이터로, 인덱스 2의 위치에 저장되어 있습니다.
*/
int형 고정 길이 덱
package ch04_2;
// int형 고정 길이 덱
public class IntDeque {
// 실행 시 예외 - 큐가 비어 있음
public class EmptyIntDequeException extends RuntimeException {
public EmptyIntDequeException() {
}
}
// 실행 시 예외 - 큐가 가득 참
public class OverflowIntDequeException extends RuntimeException {
public OverflowIntDequeException() {
}
}
private int[] que; // 덱 본체
private int capacity; // 덱 용량
private int num; // 현재 데이터 개수
private int front; // 맨 앞 요소 커서
private int rear; // 맨 끝 요소 커서
// 생성자
public IntDeque(int maxlen) {
num = front = rear = 0;
capacity = maxlen;
try {
que = new int[capacity]; // 덱 본체용 배열 생성
} catch (OutOfMemoryError error) { // 생성할 수 없음
capacity = 0;
}
}
// 덱 맨앞에 데이터 인큐
public int enqueFront(int x) throws OverflowIntDequeException {
if (num >= capacity) throw new OverflowIntDequeException(); // 덱이 가득 참
num++;
if (--front < 0) {
front = capacity - 1;
}
que[front] = x;
return x;
}
// 덱 맨끝에 데이터 인큐
public int enqueRear(int x) throws OverflowIntDequeException {
if (num >= capacity) throw new OverflowIntDequeException(); // 덱이 가득 참
que[rear++] = x;
num++;
if (rear == capacity) {
rear = 0;
}
return x;
}
// 덱의 맨앞 데이터 디큐
public int dequeFront() throws EmptyIntDequeException {
if (num <= 0) throw new EmptyIntDequeException(); // 덱이 비어있음
int x = que[front++];
num--;
if (front == capacity) {
front = 0;
}
return x;
}
// 덱의 맨끝 데이터 디큐
public int dequeRear() throws EmptyIntDequeException {
if (num <= 0) throw new EmptyIntDequeException(); // 덱이 비어있음
num--;
if (--rear < 0) {
rear = capacity - 1;
}
return que[rear];
}
// 맨앞 데이터 들여다봄
public int peekFront() throws EmptyIntDequeException {
if (num <= 0) throw new EmptyIntDequeException(); // 덱이 비어있음
return que[front];
}
// 맨끝 데이터 들여다봄
public int peekRear() throws EmptyIntDequeException {
if (num <= 0) throw new EmptyIntDequeException(); // 덱이 비어있음
return que[rear == 0 ? capacity - 1 : rear - 1];
}
// 덱에서 x 검색해 인덱스(없으면 -1) 반환
public int indexOf(int x) {
for (int i = 0; i < num; i++) {
int idx = (i + front) % capacity;
if (que[idx] == x) return idx; // 검색 성공
}
return -1; // 검색 실패
}
// 덱에서 x 검색해 맨앞에서 몇번째인지(없으면 0) 반환
public int search(int x) {
for (int i = 0; i < num; i++) {
if (que[(i + front) % capacity] == x) return i + 1; // 검색 성공
}
return 0; // 검색 실패
}
// 덱 비우기
public void clear() {
num = front = rear = 0;
}
// 덱 용량 반환
public int getCapacity() {
return capacity;
}
// 덱에 쌓여있는 데이터 수 반환
public int size() {
return num;
}
// 덱이 비어 있는가
public boolean isEmpty() {
return num <= 0;
}
// 덱이 가득 찼는가
public boolean isFull() {
return num >= capacity;
}
// 덱 안의 모든 데이터를 맨앞부터 맨끝까지 출력
public void dump() {
if(num <= 0) {
System.out.println("덱이 비어 있습니다.");
} else {
for (int i = 0; i < num; i++) {
System.out.println(que[(i + front) % capacity] + " ");
}
System.out.println();
}
}
}
int형 고정길이 덱의 테스트 프로그램
package ch04_2;
import java.util.Scanner;
// int형 고정길이 덱의 테스트 프로그램
public class Ex05_intDequeTester {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
IntDeque s = new IntDeque(64); // 최대 64개 넣을 수 있는 큐
while (true) {
System.out.printf("현재 데이터 개수 : %d / %d\\n", s.size(), s.getCapacity());
System.out.print("(1)맨앞에 인큐 (2)맨앞에서 디큐 (3)맨앞에서 피크\\n" +
"(4)맨끝에 인큐 (5)맨끝에서 디큐 (6)맨끝에서 피크\\n" +
"(7)덤프 (8)검색 (0) 종료 : ");
int menu = scanner.nextInt();
if(menu == 0) break;
int x = 0;
switch (menu) {
case 1 -> { // 맨앞에 인큐
System.out.print("데이터: ");
x = scanner.nextInt();
try {
s.enqueFront(x);
} catch (IntDeque.OverflowIntDequeException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 2 -> { // 맨앞에 디큐
try {
x = s.dequeFront();
System.out.println(" 디큐한 데이터는 " + x + "입니다.");
} catch (IntDeque.EmptyIntDequeException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 3 -> { // 맨앞에서 피크
try {
x = s.peekFront();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (IntDeque.EmptyIntDequeException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 4 -> { // 맨뒤에 인큐
System.out.print("데이터: ");
x = scanner.nextInt();
try {
s.enqueRear(x);
} catch (IntDeque.OverflowIntDequeException e) {
System.out.println("큐가 가득 찼습니다.");
}
}
case 5 -> { // 맨뒤에 디큐
try {
x = s.dequeRear();
System.out.println(" 디큐한 데이터는 " + x + "입니다.");
} catch (IntDeque.EmptyIntDequeException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 6 -> { // 맨뒤에 피크
try {
x = s.peekRear();
System.out.println("피크한 데이터는 " + x + "입니다.");
} catch (IntDeque.EmptyIntDequeException e) {
System.out.println("큐가 비어 있습니다.");
}
}
case 7 -> { // 덤프
s.dump();
}
case 8 -> { // 검색
System.out.print("데이터 : ");
x = scanner.nextInt();
int n = s.search(x);
if(n != 0) {
System.out.printf("%d번째 데이터로 인덱스%d의 위치에 저장되어 있습니다.\\n", n, s.indexOf(x));
} else {
System.out.println("그 데이터는 등록되어 있지 않습니다.");
}
}
}
}
}
}
원하는 개수만큼 값 입력받고, 요솟수가 N인 배열에 마지막 N개 저장
package ch04_2;
import java.util.Scanner;
// 원하는 개수만큼 값 입력받고, 요솟수가 N인 배열에 마지막 N개 저장
public class Ex06_lastNElements {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
final int N = 10;
int[] a = new int[N]; // 입력받은 값을 저장
int cnt = 0; // 입력받은 개수
int retry; // 다시시작
System.out.println("정수를 입력하세요.");
do {
System.out.printf("%d번째 정수: ", cnt + 1);
a[cnt++ % N] = scanner.nextInt();
System.out.print("계속 할까요? (예.1 / 아니요.0): ");
retry = scanner.nextInt();
} while (retry == 1);
int i = cnt - N;
if(i < 0) i = 0;
for (; i < cnt; i++) {
System.out.printf("%2d번째 정수 = %d\\n", i + 1, a[i % N]);
}
}
}
/*
정수를 입력하세요.
1번째 정수: 15
2번째 정수: 17
3번째 정수: 64
4번째 정수: 57
5번째 정수: 99
6번째 정수: 21
7번째 정수: 0
8번째 정수: 23
9번째 정수: 44
10번째 정수: 55
11번째 정수: 97
12번째 정수: 85
3번째 정수 = 64
4번째 정수 = 57
5번째 정수 = 99
6번째 정수 = 21
7번째 정수 = 0
8번째 정수 = 23
9번째 정수 = 44
10번째 정수 = 55
11번째 정수 = 97
12번째 정수 = 85
*/
'공부기록 > 알고리즘' 카테고리의 다른 글
Chapter 05-2. 재귀 알고리즘_재귀 알고리즘 분석 (0) | 2024.08.11 |
---|---|
Chapter 05-1. 재귀 알고리즘_재귀 알고리즘의 기본 (0) | 2024.08.11 |
Chapter 04-1. 스택과 큐_스택이란 (0) | 2024.08.04 |
Chapter 03-3. 검색 알고리즘_이진 검색 (0) | 2024.08.04 |
Chapter 03-2. 검색 알고리즘_선형 검색 (0) | 2024.08.04 |
댓글