我创建了一个队列,在每个节点中有三个信息。我想在类中创建一个成员函数,在调用时对队列进行排序。我希望队列按时间排序? (它是一个int和q_node的成员)。需要对此队列进行排序,以使“时间”的最低值排序。在前面,它按递增顺序排序。 我的队列代码如下:
typedef struct Qnode{
int time;
char name[10];
char value;
struct Qnode *q_next;
struct Qnode *q_prev;
} q_node;
class Queue{
private:
q_node *q_rear;
q_node *q_front;
int number;
public:
Queue();
void enqueue(int time, char *s, char value);
q_node *q_top(){
return q_front;
}
void dequeue();
void display();
void queueSort();
bool isEmpty();
};
Queue::Queue(){
q_rear = NULL;
q_front = NULL;
number = 0;
}
bool Queue::isEmpty(){
if (q_front == NULL)
return true;
else
return false;
}
void Queue::enqueue(int t, char *n, char v){
q_node *q_temp = new q_node;
q_temp->time = t;
strcpy(q_temp->name , n);
q_temp->value = v;
q_temp->q_next = NULL;
if(q_front == NULL){
q_front = q_temp;
}
else{
q_rear->q_next = q_temp;
}
q_rear = q_temp;
number++;
}
void Queue::dequeue(){
q_node *q_temp = new q_node;
q_temp = q_front;
q_front = q_front -> q_next;
number--;
delete q_temp;
}
void Queue::display(){
q_node *p = new q_node;
p = q_front;
while(p!=NULL){
cout<< "\ntime: " << p->time;
cout<< "\nname: " << p->name;
cout<< "\nvalue: " << p->value;
cout << endl;
p = p->q_next;
}
}
void Queue::queueSort(){
//Code for sorting
}
答案 0 :(得分:1)
一种方法是使用dequeue
将队列转储到数组或向量中,使用std::sort
,然后使用enqueue
函数从头开始重建队列。这很干净,避免弄乱指针。这也是最佳选择,因为运行时间主要取决于排序所需的时间。
类似的东西:
v = vector of nodes
while(Q.isEmpty() == false)
{ v.push_back(*Q.top());
Q.dequeue();
}
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < v.size(); i++)
{ Q.enqueue(v[i].time, v[i].name, v[i].value);
}
cmp
按时间比较节点。
答案 1 :(得分:0)
找到具有最小time
字段的节点,将其从列表中删除并使其成为新列表的头部。然后继续执行此操作,在原始列表不为空的情况下将节点附加到新列表中。当原始列表为空时,采用新的(已排序的)列表并将其设为新队列。
它可能效率不高,但应该可以正常工作。