优先队列未按正确顺序排序

Posted

技术标签:

【中文标题】优先队列未按正确顺序排序【英文标题】:Priority Queue not sorting in right order 【发布时间】:2015-04-05 13:02:46 【问题描述】:

所以我正在尝试构建一个优先级队列,该队列接受 2 个数字(0 和 2)。优先级为 0 的值将根据到达时间添加到队列的后面。优先级 2 将在优先级 0 数据包之前插入,但不会在已排队的优先级数据包之前插入。请不要使用 std::priority_queue。使用链接列表也是一项要求有人能指出我做错了什么吗?示例数据包(粗体为优先级):

55555555555555D507E34B17887100A0FF18221981000100000663727970746fC704DD7B

 pQueue100::pQueue100()
    front = NULL;


void pQueue100::insert(string packet, int priority)

    node2 *temp, *q;
    temp = new node2;
    temp ->info= packet;
    temp ->priority = priority;
    if (front == NULL ||priority <front->priority)
    
        temp->link =front;
        front = temp;
    else 
    
        q = front;
        while (q->link != NULL && q->link->priority<=priority)
            q=q->link;
        temp->link = q->link;
        q->link=temp;
    

    //display();
//insert

void pQueue100::display()

    node2 *ptr;
    ptr = front;
    //node2 *temp;
    //temp = front;

    if (front ==NULL)
        cout << "Queue is empty" <<endl;
    else 
    
        while (ptr != NULL)
        
            ptr->priority;
            //temp->info;
            cout << ptr->priority << "|" ;
            cout << ptr->info <<endl;
            ptr = ptr->link;

        
    

如果你们想看看数据包来自哪里:

void thr1::selectPQueue(string packet) //reads in packets from FIFO Queue and sorts it based on VLAN Tag and priority
    pQueue100 p100;
//  cout <<packet <<endl;//print packets for testing

    if (packet.substr(45,3) == "100") //if the packet matches VLAN 100....

        if (packet.substr(44,1) == "0")
            priorityCode = 0;
        else if (packet.substr(44,1) == "2")
            notif = "!!!!!!!!!Priority Packet Packet Found: <..." + packet.substr(16,11) + "...> !!!!!!!!!";
            priorityCode = 2;
            packetCopy = packet;
            //thr2.interupptHandler(packetCopy, notif);
        else
            priorityCode = priorityCode;

        p100.insert(packet, priorityCode);


    //end VLAN 100

    else if (packet.substr(45,3) =="101") //if the packet matches VLAN 101
    


        if (packet.substr(44,1) == "0")
            priorityCode = 0;
        else if (packet.substr(44,1) == "2")
            notif = "!!!!!!!!!Priority Packet Packet Found: <..." + packet.substr(16,11) + "...> !!!!!!!!!";
            priorityCode = 2;
            packetCopy = packet;
            //thr2.interupptHandler(packetCopy, notif);

        else
            priorityCode = priorityCode;
        //pQ101().recieveInterrupts(packet, priority,);

    //end VLAN 101

    //p100.display();

【问题讨论】:

您是否尝试过在调试器中逐行逐行执行代码,以查看它是否真的按照您的想法执行? 我认为它与 while (q->link != NULL && q->link->priority 为什么要重新发明***?你当然可以使用std::priority_queue 吗? 您没有显示该类,因此我们不知道这些成员函数的上下文。你应该研究标准库和 Boost 代码并了解它是如何工作的,而不是试图猜测专家所知道的一切,无中生有。显示的代码存在一些基本问题。 @JDługosz 我希望您的意思是“研究标准库和 Boost 接口”,因为我不希望我最大的敌人研究实现。大型标准库和 Boost 库的实现简单、精简且有效,但不适合刚学习 C++ 的人。 【参考方案1】:

颠倒您使用的比较运算符是一件简单的事情。

void pQueue100::insert(string packet, int priority)

    node2 *temp, *q;
    temp = new node2;
    temp ->info= packet;
    temp ->priority = priority;
    if (front == NULL ||priority > front->priority)
    
        temp->link =front;
        front = temp;
    else 
    
        q = front;
        while (q->link != NULL && q->link->priority >= priority)
            q=q->link;
        temp->link = q->link;
        q->link=temp;
    

驱动代码:

int main() 

    pQueue100 q;
    q.insert("alpha", 0);
    q.insert("beta", 2);
    q.insert("gamma", 0);
    q.insert("delta", 2);
    q.insert("epsilon", 0);
    q.insert("zeta", 2);
    // correct display sequence should be:
    // beta, delta, zeta, alpha, gamma, epsilon
    q.display();

输出:

2|beta
2|delta
2|zeta
0|alpha
0|gamma
0|epsilon

【讨论】:

以上是关于优先队列未按正确顺序排序的主要内容,如果未能解决你的问题,请参考以下文章

堆堆排序与优先队列

堆排序

我有一个字符串,我需要根据自定义顺序进行排序,并且我正在使用优先级队列,但优先级队列因重复而失败 [重复]

scala优先级队列没有正确排序?

C语言/C++,基于优先级队列的拓扑排序。

优先级队列对对象排序不正确(用户定义的比较)