IntLinkedQueue 클래스
2025. 4. 20. 19:48ㆍ자료구조
코드 설명
/******************************************************************************
* IntLinkedQueue 클래스는 정수 큐를 연결 리스트로 구현한 클래스입니다.
******************************************************************************/
public class IntLinkedQueue implements Cloneable {
// IntLinkedQueue 클래스의 불변 조건 (Invariant):
// 1. 큐에 있는 항목 수는 manyNodes 변수에 저장됩니다.
// 2. 큐에 있는 항목은 연결 리스트에 저장되며,
// 큐의 앞부분은 head 노드(맨 앞 노드), 뒷부분은 마지막 노드에 해당합니다.
// 3. 큐가 비어 있지 않은 경우, front는 리스트의 첫 노드를, rear는 마지막 노드를 참조합니다.
// 큐가 비어 있는 경우, front와 rear는 둘 다 null입니다.
private int manyNodes;
private IntNode front;
private IntNode rear;
/**
* 빈 큐를 초기화합니다.
* @param - 없음
* <dt><b>후조건:</b><dd>
* 큐가 비어 있게 됩니다.
**/
public IntLinkedQueue() {
front = null;
rear = null;
manyNodes = 0;
}
/**
* 현재 큐의 복사본을 생성합니다.
* @param - 없음
* @return
* 복사된 큐 객체가 반환됩니다. 복사본에 대한 변경은 원본에 영향을 주지 않으며, 그 반대도 마찬가지입니다.
* 반환값은 <CODE>IntLinkedQueue</CODE> 타입으로 형변환되어야 사용 가능합니다.
* @exception OutOfMemoryError
* 복사 과정에서 메모리가 부족한 경우 발생합니다.
**/
public Object clone() {
IntLinkedQueue answer;
IntNode[] cloneInfo;
try {
answer = (IntLinkedQueue) super.clone();
} catch (CloneNotSupportedException e) {
// 이 예외는 발생하지 않아야 하지만, 발생하면 보통 super.clone을 사용할 수 없도록
// Cloneable 인터페이스를 구현하지 않았다는 실수일 수 있습니다.
throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
}
cloneInfo = IntNode.listCopyWithTail(front);
answer.front = cloneInfo[0];
answer.rear = cloneInfo[1];
return answer;
}
/**
* 큐의 앞 항목을 가져오고, 해당 항목을 큐에서 제거합니다.
* @param - 없음
* <dt><b>전제조건:</b><dd>
* 큐가 비어 있지 않아야 합니다.
* <dt><b>후조건:</b><dd>
* 반환값은 큐의 앞 항목이며, 해당 항목은 큐에서 제거됩니다.
* @exception NoSuchElementException
* 큐가 비어 있는 경우 발생합니다.
**/
public int getFront() {
int answer;
if (manyNodes == 0)
throw new NoSuchElementException("큐 언더플로우");
answer = front.getData();
front = front.getLink();
manyNodes--;
if (manyNodes == 0)
rear = null;
return answer;
}
/**
* 큐에 새 항목을 삽입합니다.
* @param <CODE>item</CODE>
* 큐에 삽입할 항목입니다.
* <dt><b>후조건:</b><dd>
* 항목이 큐에 삽입됩니다.
* @exception OutOfMemoryError
* 큐의 용량을 늘릴 수 없을 정도로 메모리가 부족한 경우 발생합니다.
* <dt><b>참고:</b><dd>
* 용량을 <CODE>Integer.MAX_VALUE</CODE> 이상으로 증가하려고 하면
* 정수 오버플로우로 인해 실패할 수 있습니다.
**/
public void insert(int item) {
if (isEmpty()) {
// 첫 항목 삽입
front = new IntNode(item, null);
rear = front;
} else {
// 첫 항목이 아닌 경우 삽입
rear.addNodeAfter(item);
rear = rear.getLink();
}
manyNodes++;
}
/**
* 큐가 비어 있는지 확인합니다.
* @param - 없음
* @return
* 큐가 비어 있으면 <CODE>true</CODE>, 아니면 <CODE>false</CODE>
**/
public boolean isEmpty() {
return (manyNodes == 0);
}
/**
* 큐에 저장된 항목의 수를 반환합니다.
* @param - 없음
* @return
* 큐에 저장된 항목의 개수
**/
public int size() {
return manyNodes;
}
}
인스턴스 멤버
private int manyNodes;
private IntNode front;
private IntNode rear;
- manyItems는 데이터의 개수를 의미한다.
- front는 맨 앞의 노드를 가리키고 rear는 맨 뒤의 노드를 가리킨다.
생성자
public IntLinkedQueue() {
front = null;
rear = null;
manyNodes = 0;
}
- front, rear를 null로, manyNodes를 0으로 초기화시켜준다.
메서드
public Object clone() {
IntLinkedQueue answer;
IntNode[] cloneInfo;
try {
answer = (IntLinkedQueue) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("이 클래스는 Cloneable을 구현하지 않았습니다.");
}
cloneInfo = IntNode.listCopyWithTail(front);
answer.front = cloneInfo[0];
answer.rear = cloneInfo[1];
return answer;
}
- (IntLinkedQueue) super.clone()로 얕은 복사를 해주고, IntNode에서 제공하는 listCopyWithTail로 front와 rear를 깊은 복사 해준다.
public int getFront() {
int answer;
if (manyNodes == 0)
throw new NoSuchElementException("큐 언더플로우");
answer = front.getData();
front = front.getLink();
manyNodes--;
if (manyNodes == 0)
rear = null;
return answer;
}
- 만약 데이터의 개수가 0이라면 에러를 발생시킨다.
- 아니라면 현제 위치의 데이터를 answer에 저장해 주고 front를 front와 연결된 링크로 이동시켜 준고 manyItems를 1 줄여준다.
- 만약 데이터의 개수가 0이라면 rear를 없음 처리해주어야 한다.
public void insert(int item) {
if (isEmpty()) {
// 첫 항목 삽입
front = new IntNode(item, null);
rear = front;
} else {
// 첫 항목이 아닌 경우 삽입
rear.addNodeAfter(item);
rear = rear.getLink();
}
manyNodes++;
}
- 만약 데이터가 비어있다면 front에 데이터를 새로 추가해 주고 rear를 front로 지정해줘야 한다.
- 그리고 첫 항목이 아니라면 addNodeAfter를 활용하여서 이후에 넣어 주고, rear를 다음 Node로 지정해 주어야 한다.
public boolean isEmpty() {
return (manyNodes == 0);
}
public int size() {
return manyNodes;
}
- isEmpty는 데이터의 개수가 0인 경우에 true 아니라면 false를 리턴해주면 된다.
- size는 manyNodes를 리턴해주면 된다.
'자료구조' 카테고리의 다른 글
| IntLinkedStack 클래스 (0) | 2025.04.20 |
|---|---|
| 스택 활용하기 (0) | 2025.04.20 |
| IntStack 클래스 (0) | 2025.04.19 |
| IntNode 클래스 (0) | 2025.04.19 |
| IntLinkedBag 클래스 (0) | 2025.04.18 |