#c #queue #priority-queue
Вопрос:
Я создал очередь и поставил в очередь некоторые значения. Затем я хочу удалить из очереди наименьшее значение. Я получил наименьшее значение с помощью линейного поиска. Но я не знаю, как обращаться с передней и задней частями после того, как найду наименьшее значение.
#include <stdio.h>
#define SIZE 5
void enQueue(int);
void deQueue();
int items[SIZE], front = -1, rear = -1;
int main() {
enQueue(3);
enQueue(5);
enQueue(4);
enQueue(1);
enQueue(2);
printf("Deleted value is %dn",deQueue());
return 0;
}
void enQueue(int value) {
if (rear == SIZE - 1)
printf("nQueue is Full!!");
else {
if (front == -1)
front = 0;
rear ;
items[rear] = value;
printf("nInserted -> %d", value);
}
}
int deQueue() {
if (front == -1)
exit(1);
else {
int min=0;
for(int i=front;i<rear;i ){
if(items[min]>items[i])
min=i;
}
int value=items[min];
//What should I do then for front and rear in order to remove the deleted value
return value;
}
}
Комментарии:
1. Это не просто то
front
,rear
с чем вам нужно иметь дело. Вам нужно сжать все записи после удаленной. То есть скопируйте каждую запись после удаленной в индекс перед исходным индексом. Затем уменьшите заднюю часть на единицу. Ничего не нужно делать спереди, если только он не был удален, чтобы оставить пустую очередь, и в этом случае его нужно установить в -1. Таков алгоритм на словах. Теперь попробуйте это на листе бумаги, а затем попробуйте закодировать его.2. Если вам всегда нужен самый маленький элемент в очереди, вам следует реализовать минимальную кучу
Ответ №1:
items[min]=items[rear];
rear--;
Комментарии:
1. Это идеально, если
items
неупорядочено, но очередь обычно упорядочена, так что в этом случае могут возникнуть проблемы.