我有以下队列类(取自wordpress):
#include<iostream.h>
class Queue
{
private:
int data;
Queue*next;
public:
void Enque(int);
int Deque();
}*head,*tail;
void Queue::enque(int data)
{
Queue *temp;
temp=new Queue;
temp->data=data;
temp->next=NULL;
if(heads==NULL)
heads=temp;
else
tail->next=temp;
tail=temp;
}
int Queue::deque()
{
Queue* temp;//
temp=heads;
heads=heads->next;
return temp->data;
}
我试图找出编译器为什么告诉我有多重定义的原因 “头”和“尾巴” - 没有成功。
编辑:当编译器给出错误消息时,它会打开一个locale_facets.tcc文件 来自I-not-know-where并说错误在以下函数中的第2497行:
bool
__verify_grouping(const char* __grouping, size_t __grouping_size,
const string& __grouping_tmp)
有没有人有任何见解?
答案 0 :(得分:9)
由于这是家庭作业,这里有一些关于队列的信息以及如何实施这些队列。
队列是标准的抽象数据类型。 它有几个与之相关的属性:
可以使用顺序数组或链接列表对队列进行建模 如果您正在使用数组,则需要考虑一些因素,因为您在一个方向上增长,因此最终会耗尽数组。然后你可以做出一些选择(转变与成长)。如果您选择返回到数组的开头(环绕),则必须确保头部和尾部不重叠。如果您选择简单地增加队列,则会浪费大量内存。
如果您使用的是Linked-List,则可以在任何位置插入,队列将从尾部增长并从头部缩小。您也不必担心填写列表并且必须包装/移动元素或增长。
但是,您决定实现队列,请记住Queues应该提供一些使用队列的通用接口。以下是一些例子:
您可能希望将其他操作添加到队列中(在C ++中,您可能需要在队列的前端/后端使用迭代器)但是如何构建队列不应该对操作产生影响提供。
但是,根据您希望如何使用队列,有更好的方法来构建它。通常的权衡是插入/移除时间与搜索时间的关系。这是a decent reference。
答案 1 :(得分:5)
如果您的作业与队列实现没有直接关系,您可能希望在C ++中使用内置的std::queue
类:
#include <queue>
void test() {
std::queue<int> myQueue;
myQueue.push(10);
if (myQueue.size())
myQueue.pop();
}
答案 2 :(得分:4)
为什么不在标准C ++库中使用队列?
#include <queue>
using namespace std;
int main() {
queue<int> Q;
Q.push(1);
Q.push(2);
Q.push(3);
Q.top(); // 1
Q.top(); // 1 again, we need to pop
Q.pop(); // void
Q.top(); // 2
Q.pop();
Q.top(); // 3
Q.pop();
Q.empty(); // true
return 0;
}
答案 3 :(得分:2)
有一些问题:
答案 4 :(得分:1)
如果你需要这个用于BFS ......只需使用deque。
#include <deque>
using namespace std;
void BFS() {
deque<GraphNode*> to_visit;
to_visit.push_back(start_node);
while (!to_visit.empty()) {
GraphNode* current = to_visit.front();
current->visit(&to_visit); // enqueues more nodes to visit with push_back
to_visit.pop_front();
}
}
GraphNode::visit
方法应该完成所有“工作”并将更多节点添加到要访问的队列中。您应该使用的唯一方法是push_back()
,front()
和pop_front()
这就是我经常这样做的方式。希望这会有所帮助。
答案 5 :(得分:1)
看起来你的问题可能与以下事实有关:
class Queue {
// blah
} *head, * tail;
正在定义Queue
类,并将head
和tail
声明为Queue*
类型。他们看起来不像班上的成员,他们应该是。