gpt4 book ai didi

java - 使用ArrayList实现循环队列

转载 作者:行者123 更新时间:2023-12-02 03:10:48 24 4
gpt4 key购买 nike

好的,用数组实现循环队列很容易。

这里我有代码尝试使用数组列表实现循环队列。问题是,即使我已经实现了我的 deque 和 enque 方法,但这不适用于我的 arraylist(但这适用于普通数组)....

与数组不同,如果我在数组列表上使用此代码,它似乎会在不同位置错误地删除和添加

import java.util.*;

public class People {

private final int DEFAULT_CAPACITY = 100;
private int front, rear, count;
private ArrayList<thePeople> people;
private int theMaxCapacity;

//-----------------------------------------------------------------
// Creates an empty queue using the specified capacity.
//-----------------------------------------------------------------
public People(int initialCapacity) {
front = rear = count = 0;
people = new ArrayList<thePeople>(Collections.nCopies(5, (thePeople) null));

}

//-----------------------------------------------------------------
// Adds the specified element to the rear of the queue, expanding
// the capacity of the queue array if necessary.
//-----------------------------------------------------------------
public void enque(thePeople element) {
if (this.isFull()) {
System.out.println("Queue Full");

System.exit(1);
} else {
people.set(rear, element);
rear = rear + 1;
if (rear == people.size()) {
rear = 0;
}
count++;
}
}

//-----------------------------------------------------------------
// Removes the element at the front of the queue and returns a
// reference to it. Throws an EmptyCollectionException if the
// queue is empty.
//-----------------------------------------------------------------
public thePeople dequeue() {
if (isEmpty()) {
System.out.println("Empty Queue");
}

thePeople result = people.get(front);
people.set(front, null);

front = (front + 1) % people.size();

count--;

return result;
}

//-----------------------------------------------------------------
// Returns true if this queue is empty and false otherwise.
//-----------------------------------------------------------------
public boolean isEmpty() {
return (count == 0);
}

//-----------------------------------------------------------------
// Returns the number of elements currently in this queue.
//-----------------------------------------------------------------
public int size() {
return count;
}

public boolean isFull() {

return count == people.size();
}

public void mySimulation() {
Random rand1 = new Random();
thePeople theM = null;

if (this.isFull()) {
this.people.remove(0);
System.out.println("Enqueueing...");
this.enque(people.get(rand1.nextInt(people.size())));
thePeople r1 = people.get(rear - 1);
System.out.println(people.toString());
System.out.println(r1);
for (int e = 0; e < people.size(); e++) {
if (people.get(e) instanceof thePeople) {
System.out.println("G");
} else {
System.out.println("D");
}
}

}

}

//-----------------------------------------------------------------
// Returns a string representation of this queue.
//-----------------------------------------------------------------
@Override
public String toString() {
String result = "";
int scan = 0;

while (scan < count) {
if (people.get(scan) != null) {
result += people.get(scan).toString() + "\n";
}
scan++;
}

return result;

}

public static void main(String[] args) {
People Q1 = new People(25);
thePeople call1 = new thePeople("John King", "001 456 789");
thePeople call2 = new thePeople("Michael Fish", "789 654 321");

Q1.enque(call1);
Q1.enque(call2);

System.out.println(Q1.toString());
ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2));
Random rand = new Random();
for (int z = 0; z <= 4; z++) {
Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size())));

}
System.out.println(Q1.toString());

}

}

我的问题是如何修改 enque 和 deque 方法以使用 araylist(循环队列 arraylist)?

最佳答案

我对您的代码进行了一些更改,看看是否对您有帮助。

import java.util.*;

public class People {

private final int DEFAULT_CAPACITY = 100;
private int front, rear, count;
private ArrayList<thePeople> people;
private int theMaxCapacity;

//-----------------------------------------------------------------
// Creates an empty queue using the specified capacity.
//-----------------------------------------------------------------
public People(int initialCapacity) {
front = rear = count = 0;
people = new ArrayList<thePeople>();

}

//-----------------------------------------------------------------
// Adds the specified element to the rear of the queue, expanding
// the capacity of the queue array if necessary.
//-----------------------------------------------------------------
public void enque(thePeople element) {
if (this.isFull()) {
System.out.println("Queue Full");
System.exit(1);
} else {
people.add(element);
}
}

//-----------------------------------------------------------------
// Removes the element at the front of the queue and returns a
// reference to it. Throws an EmptyCollectionException if the
// queue is empty.
//-----------------------------------------------------------------
public thePeople dequeue() {
if (isEmpty()) {
System.out.println("Empty Queue");
}

thePeople result = people.get(0);
people.remove(0);

return result;
}

//-----------------------------------------------------------------
// Returns true if this queue is empty and false otherwise.
//-----------------------------------------------------------------
public boolean isEmpty() {
return (people.size() == 0);
}

//-----------------------------------------------------------------
// Returns the number of elements currently in this queue.
//-----------------------------------------------------------------
public int size() {
return people.size();
}

public boolean isFull() {

return people.size() == DEFAULT_CAPACITY;
}

public void mySimulation() {
Random rand1 = new Random();
thePeople theM = null;

if (this.isFull()) {
this.people.remove(0);
System.out.println("Enqueueing...");
this.enque(people.get(rand1.nextInt(people.size())));
thePeople r1 = people.get(rear - 1);
System.out.println(people.toString());
System.out.println(r1);
for (int e = 0; e < people.size(); e++) {
if (people.get(e) instanceof thePeople) {
System.out.println("G");
} else {
System.out.println("D");
}
}

}

}

//-----------------------------------------------------------------
// Returns a string representation of this queue.
//-----------------------------------------------------------------
@Override
public String toString() {
String result = "";
int scan = 0;

while (scan < count) {
if (people.get(scan) != null) {
result += people.get(scan).toString() + "\n";
}
scan++;
}

return result;

}

public static void main(String[] args) {
People Q1 = new People(25);
thePeople call1 = new thePeople("John King", "001 456 789");
thePeople call2 = new thePeople("Michael Fish", "789 654 321");

Q1.enque(call1);
Q1.enque(call2);

System.out.println(Q1.toString());
ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2));
Random rand = new Random();
for (int z = 0; z <= 4; z++) {
Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size())));

}
System.out.println(Q1.toString());

}

}

关于java - 使用ArrayList实现循环队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41088144/

24 4 0