我有一个存储指向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'最后的节点。
效率并非真正的标准。我该怎么做呢?
答案 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'。
这样效率不高,可能会将整个队列存储在一个数组中,然后对其进行排序并在队列中替换是一种更好的方法。