使用数组实现一个先进先出的队列类 MyQueue,并用测试类进行测试
时间: 2024-09-18 16:13:33 浏览: 49
要使用数组实现一个先进先出(FIFO)的队列类 `MyQueue`,我们可以创建一个固定大小的数组以及两个指针,一个指向队首(front),另一个指向队尾(rear)。当队列满时,我们就无法再添加元素;当队列空时,我们才能添加新的元素。以下是一个简单的 Java 实现:
```java
public class MyQueue<T> {
private static final int MAX_CAPACITY = 10; // 队列最大容量
private T[] queueData; // 存储数据的数组
private int front, rear; // 指针
public MyQueue() {
this.queueData = (T[]) new Object[MAX_CAPACITY];
front = rear = -1;
}
// 入队操作
public void enqueue(T item) {
if (isFull()) {
throw new IllegalStateException("Queue is full");
}
if (isEmpty()) {
front = rear = 0;
} else {
rear = (rear + 1) % MAX_CAPACITY; // 尾部指针加一并取模防止溢出
}
queueData[rear] = item;
}
// 出队操作
public T dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty");
}
T removedItem = queueData[front]; // 获取队首元素
if (front == rear) { // 如果队列只剩下一个元素
front = rear = -1; // 更新双指针
} else {
front = (front + 1) % MAX_CAPACITY; // 队首指针加一并取模
}
return removedItem;
}
// 判断队列是否为空
public boolean isEmpty() {
return front == -1;
}
// 判断队列是否已满
public boolean isFull() {
return (rear + 1) % MAX_CAPACITY == front;
}
// 返回队列的元素个数
public int size() {
if (isEmpty()) {
return 0;
} else {
return rear - front + 1;
}
}
}
```
接下来,我们可以创建一个测试类来进行验证:
```java
import org.junit.Test;
public class MyQueueTest {
@Test
public void testQueueOperations() {
MyQueue<Integer> queue = new MyQueue<>();
// 测试入队
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// 测试出队
assertEquals(1, queue.dequeue());
assertEquals(2, queue.dequeue());
assertEquals(3, queue.dequeue());
// 测试队列是否为空
assertTrue(queue.isEmpty());
// 测试队列是否已满
assertFalse(queue.isFull());
// 再次填充队列
queue.enqueue(4);
queue.enqueue(5);
// 验证再次出队
assertEquals(4, queue.dequeue());
assertEquals(5, queue.dequeue());
// 最后确认队列是否为空
assertTrue(queue.isEmpty());
}
}
```
在这个测试类中,我们首先对队列进行了一些基本的操作,如入队、出队等,然后检查了队列的状态(是否为空、是否已满)。
阅读全文