Как удалить наименьший элемент из очереди в C

#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 неупорядочено, но очередь обычно упорядочена, так что в этом случае могут возникнуть проблемы.