Задать вопрос
get2top
@get2top

Структура данных. Как реализировать очередь в Java (Queue)?

У меня вот такая задача. Есть Ключ (на пример на 10 цифр). Мне нужно поместить его в очередь и N-ое количество раз брать первый елемент с очереди, делать над ним операцию и класть его назад в очередь и так очень большое количество раз.

В чем проблема? - Реализация очереди которую я написал, работает только до определенного момента. Тоесть в памяти храняться все обекты класа Node и когда памать полная, программа зависает и не выполняеться дальше.

Вот написал пример, кто может мне обяснить как это исправить?

Класс Main
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        DynamicQueue<Integer> queue = new DynamicQueue<>();
        int[] key = {4,2,2,5,6,1,4,2,3};
        for(int i=0; i<key.length; i++){
            queue.enqueue(i);
        }
        int a;
        for(int i=0; i<1_000_000_000; i++){
            a = queue.dequeue();
            queue.enqueue(a);
        }
        System.out.println("finish");
    }
}


Класс DynamicQueue
import java.io.IOException;
public class DynamicQueue<T> {
    private Node<T> back;
    private Node<T> front;
    private int size;
    public DynamicQueue() {
        back = null;
        size = 0;
    }
    public void enqueue(T e) {
        if (isEmpty()){
            Node<T> n = new Node<T>(null, null, e);
            back = n;
            front = n;
            size++;
        }
        else {
            Node<T> n = new Node<T>(null, front, e);
            front.setNext(n);
            size++;
            front = n;
        }
    }
    public T dequeue() throws IOException {
        if (!isEmpty()){
            T aux = (T) back.getElement();
            size--;
            back = back.getNext();
            return aux;
        }
        else throw new NullPointerException();
    }
    public boolean isEmpty() {
        return size == 0;
    }
    public int size() {
        return size;
    }
    public boolean isFull() {
        return false;
    }
}


Класс Node
public class Node<T> {
    private Node<T> next;
    private Node<T> prev;
    private T element;
    public Node(Node<T> prox, Node<T> ant, T element) {
        this.next = prox;
        this.prev = ant;
        this.element = element;
    }
    public Node<T> getNext() {
        return next;
    }
    public void setNext(Node<T> prox) {
        this.next = prox;
    }
    public Node<T> getPrev() {
        return prev;
    }
    public void setPrev(Node<T> ant) {
        this.prev = ant;
    }
    public T getElement() {
        return element;
    }
    public void setElement(T element) {
        this.element = element;
    }
}
  • Вопрос задан
  • 2229 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
AxianLTD
@AxianLTD
Первая заповедь программиста - не изобретать велосипед. Для управления очередями существует куча готовых реализаций. Например https://www.rabbitmq.com/tutorials/tutorial-one-ja... А здесь обо всех более-менее значимых проектах менеджеров очередей queues.io
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы