Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программирование на java

Данила Скворцов Ученик (82), на голосовании 1 год назад
Помогите пожалуйста надо написать реализацию очереди с приоритетом(Priority queue). У пользователя должны быть доступны методы добавления и удаления из Priority queue элементов.

Условия:

- Нельзя использовать шаблоны(готовый Priority queue, методы для работы с ним)
Голосование за лучший ответ
Александр Дзен Мыслитель (5114) 1 год назад
Конечно, я могу помочь вам с реализацией очереди с приоритетом на Java без использования готовых шаблонов или библиотек. Вот пример простой реализации:

```java
import java.util.ArrayList;
import java.util.List;

public class PriorityQueue {
private List<Integer> elements;

public PriorityQueue() {
elements = new ArrayList<>();
}

public void add(int element) {
elements.add(element);
int currentIndex = elements.size() - 1;

while (currentIndex > 0) {
int parentIndex = (currentIndex - 1) / 2;
if (elements.get(currentIndex) <= elements.get(parentIndex)) {
break;
}

swap(currentIndex, parentIndex);
currentIndex = parentIndex;
}
}

public int remove() {
if (elements.isEmpty()) {
throw new IllegalStateException("Priority queue is empty.");
}

int root = elements.get(0);
int lastIndex = elements.size() - 1;
elements.set(0, elements.get(lastIndex));
elements.remove(lastIndex);
lastIndex--;

int currentIndex = 0;
while (true) {
int leftChildIndex = 2 * currentIndex + 1;
int rightChildIndex = 2 * currentIndex + 2;
int maxIndex = currentIndex;

if (leftChildIndex <= lastIndex && elements.get(leftChildIndex) > elements.get(maxIndex)) {
maxIndex = leftChildIndex;
}

if (rightChildIndex <= lastIndex && elements.get(rightChildIndex) > elements.get(maxIndex)) {
maxIndex = rightChildIndex;
}

if (maxIndex == currentIndex) {
break;
}

swap(currentIndex, maxIndex);
currentIndex = maxIndex;
}

return root;
}

private void swap(int i, int j) {
int temp = elements.get(i);
elements.set(i, elements.get(j));
elements.set(j, temp);
}
}
```

В этой реализации используется список `ArrayList` для хранения элементов очереди. Метод `add` добавляет элемент в очередь и перестраивает её так, чтобы элементы располагались в порядке убывания приоритета. Метод `remove` удаляет и возвращает элемент с наивысшим приоритетом из очереди. Оба метода работают с временной сложностью O(log n), где n - количество элементов в очереди.

Вы можете использовать эту реализацию следующим образом:

```java
public class Main {
public static void main(String[] args) {
PriorityQueue priorityQueue = new PriorityQueue();

priorityQueue.add(3);
priorityQueue.add(1);
priorityQueue.add(4);
priorityQueue.add(2);

System.out.println(priorityQueue.remove()); // Вывод: 4
System.out.println(priorityQueue.remove()); // Вывод: 3
System.out.println(priorityQueue.remove()); // Вывод: 2
System.out.println(priorityQueue.remove()); // Вывод: 1
}
}
```

Надеюсь, это поможет вам реализовать очередь с приоритетом на Java! Если у вас возникнут еще вопросы, не стесняйтесь
Данила СкворцовУченик (82) 1 год назад
Большое спасибо сейчас попробую
Похожие вопросы