Цикл массива очередей

1

Скажем, что у меня есть массив размера [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;
        }

    }
}
Теги:
arrays
loops
queue

2 ответа

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 и добавляете значение до конца.

0

Я попытался построить очередь, используя заднюю и переднюю, как вы. Немного изменил вашу вставку. Я написал основной метод с некоторым тестом.

Также мне пришлось добавить "пустой" флаг, чтобы проверить, является ли задний фронт, потому что он пуст или потому что он заполнен.

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());
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню