根据此条件对队列进行排序

时间:2015-04-28 15:17:25

标签: c++

我有一个存储指向Node对象的指针的队列,定义为:

class Node {
public:
    Node(int, char, Node*);
    void setC(char);
    char getC();
private:
    int x;
    char c;
    Node* next;
};

此处,c可以是' S' M' M'或者' L'。 (小,中或大)。现在,我想按照所有' S'开头/前面的节点,然后是所有的' M'节点和所有' L'最后的节点。

效率并非真正的标准。我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

您可以使用priority_queue

#include <queue>
#include <iostream>

using namespace std;

class Node { /* ... */ };

// 'S' < 'M' < 'L'
bool operator< (const Node& lhs, const Node& rhs)
{
    switch(lhs.c) {
        case 'S': return !('S' == rhs.getC());
        case 'M': return ('L' == rhs.getC());
        case 'L': return false;
        default:  throw "must be S, M or L";
    }
}

int main() {
    priority_queue<Node> pq;

    pq.push(Node('S'));
    pq.push(Node('M'));
    pq.push(Node('L'));
    pq.push(Node('S'));
    pq.push(Node('M'));
    pq.push(Node('L'));

    while(pq.size()) {
        cout << pq.top().getC() << endl;
        pq.pop();
    }
}

将按降序排列:

L
L
M
M
S
S

答案 1 :(得分:0)

您可以创建三个堆栈,然后清空队列并将每个类型放在其中一个堆栈中。然后再次填充队列以堆栈'S'开始,然后堆叠'M'并最后'L'。

这样效率不高,可能会将整个队列存储在一个数组中,然后对其进行排序并在队列中替换是一种更好的方法。