Скажем, что у меня есть массив размера [10], и когда этот массив заполняется, я хочу реализовать структуру FIFO вместо того, чтобы просто быть полным и, следовательно, не мог добавлять новые вещи в массив и выбрасывать старые.
Например, если у меня есть массив String с автопроизводителями, и когда у меня есть 10 производителей в моем массиве, я хочу, чтобы самая старая запись была удалена, и была добавлена самая новая запись, но нужно помнить FIFO. Как бы реализовать это в методе, подобном этому:
public void insert(String name)
{
int a;
a = (rear + 1) % names.length;
if(a == front)
{
System.out.println("Full Queue!");
}
else
{
rear = a;
names[rear] = name;
if(front == -1)
{
front = 0;
}
}
}
Я рекомендую использовать реализацию LinkedList
public class LinkedList {
Node head;
Node tail;
final int MAX_SIZE;
int currentSize;
public LinkedList(int MAX_SIZE) {
this.head = null;
this.tail = null;
this.MAX_SIZE = MAX_SIZE;
this.currentSize = 0;
}
public void append(String val) {
Node n = new Node(val);
if (currentSize < MAX_SIZE) {
if (head == null) {
head = n;
tail = n;
return;
}
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = n;
currentSize++;
}
else {
head = head.next;
currentSize--;
append(val);
}
}
public class Node {
String val;
Node next;
public Node(String val) {
this.val = val;
this.next = null;
}
}
В основном у вас есть MAX_SIZE
и currentSize
. Когда ваш currentSize достигает максимума, вы удаляете голову LinkedList
и добавляете значение до конца.
Я попытался построить очередь, используя заднюю и переднюю, как вы. Немного изменил вашу вставку. Я написал основной метод с некоторым тестом.
Также мне пришлось добавить "пустой" флаг, чтобы проверить, является ли задний фронт, потому что он пуст или потому что он заполнен.
public class DummyQueue {
int rear, front;
String[] names;
boolean empty = true;
public DummyQueue(int size) {
names = new String[size];
}
public void insert(String name)
{
if(!empty && rear == front )
{
System.out.println("Full Queue!");
}
else
{
names[rear] = name;
rear = (rear+1) % names.length;
}
empty = false;
}
public String deque()
{
if (empty) {
System.out.println("Empty Queue!");
return null; // demo
} else {
String response = names[front % names.length];
front = (front + 1) % names.length;
if (front == rear) empty = true;
return response;
}
}
public static void main(String[] args) {
DummyQueue d = new DummyQueue(10);
System.out.println(d.deque());
d.insert("Element");
System.out.println(d.deque());
System.out.println(d.deque());
for (int i = 0; i < 12; i++) {
System.out.println("Adding: "+i);
d.insert("Element "+ i);
}
for (int i = 0; i < 12; i++) {
System.out.println(d.deque());
}
}
}