Я пытаюсь реализовать очередь с использованием кругового массива. Мой код должен быть способен удалить самое низкое число из очереди. Я создал тестовый код, который должен выводить 1 2 3 4 5, поскольку самые низкие значения удаляются, но мой фактический результат равен 3 2 1 8 7. Я не уверен, что моя проблема в том, что мой код для нахождения самого низкого значения неверен или существует проблема с тем, как я кодирую фактическую очередь. Я подозреваю, что оба, но я был бы признателен за любые предложения или советы по поиску проблем в моем коде.Реализация очереди приоритетов в C++
#include <iostream>
using namespace std;
class priorityQueue
{
private:
int front;
int rear;
int size;
int *array;
public:
priorityQueue();
~priorityQueue();
void insert(int x);
//remove and return the smallest item currently in the priority queue
int extractMin();
bool empty();
};
priorityQueue::priorityQueue()
{
front = rear = -1;
size = 10;
array = new int[size];
}
priorityQueue::~priorityQueue()
{
delete[] array;
}
void priorityQueue::insert(int x)
{
//if queue is full
if ((rear + 1)% size == front){
return;
}
//else if queue is empty
else if (empty()){
rear = front = 0;
}
else
{
rear = (rear + 1) % size;
}
array[rear] = x;
}
//extract and return smallest value in queue
int priorityQueue::extractMin()
{
int minValue = array[front];
if (empty()){
return -1;
}
else if (front == rear){
front = rear = -1;
}
else
{
front = (front + 1) % size;
}
//find smallest value
for (int i = front; i <= rear; i++){
if (array[i] < minValue)
minValue = array[i];
}
//return smallest value
return array[front];
}
bool priorityQueue::empty()
{
if ((front == -1) && (rear == -1))
return true;
else
return false;
}
int main()
{
priorityQueue myqueue;
myqueue.insert(4);
myqueue.insert(3);
myqueue.insert(2);
myqueue.insert(1);
cout << myqueue.extractMin() << endl;
cout << myqueue.extractMin() << endl;
myqueue.insert(8);
myqueue.insert(7);
myqueue.insert(6);
myqueue.insert(5);
cout << myqueue.extractMin() << endl;
cout << myqueue.extractMin() << endl;
cout << myqueue.extractMin() << endl;
system("pause");
return 0;
}
Это правильно, что вы возвращаете массив [front] not minValue из extractMin()? – 4pie0
пропустил это. спасибо, что поймали его. – JosephK
Примечание: ваша очередь сломана, если вы попытаетесь ее скопировать, вы, вероятно, столкнетесь с крахом. Вместо использования 'new', попробуйте использовать' std :: vector '; вы можете удалить деструктор, который вы написали, поскольку он будет бесполезен. В общем, я советую вам не смешивать обязанности: один класс для обработки памяти, один класс для обработки логики, таким образом, оба являются простыми (и могут быть протестированы независимо). –