实现一个队列

时间:2009-05-16 21:47:47

标签: c++ queue

我有以下队列类(取自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)

有没有人有任何见解?

6 个答案:

答案 0 :(得分:9)

由于这是家庭作业,这里有一些关于队列的信息以及如何实施这些队列。

队列是标准的抽象数据类型。 它有几个与之相关的属性:

  1. 这是一种线性数据结构 - 所有组件都排成一条直线。
  2. 它有一个增长/衰减规则 - 从两端添加和删除队列。
  3. 了解它们的构造方式不应该是使用它们的必要条件,因为它们具有可用的公共接口。
  4. 可以使用顺序数组或链接列表对队列进行建模 如果您正在使用数组,则需要考虑一些因素,因为您在一个方向上增长,因此最终会耗尽数组。然后你可以做出一些选择(转变与成长)。如果您选择返回到数组的开头(环绕),则必须确保头部和尾部不重叠。如果您选择简单地增加队列,则会浪费大量内存。

    如果您使用的是Linked-List,则可以在任何位置插入,队列将从尾部增长并从头部缩小。您也不必担心填写列表并且必须包装/移动元素或增长。

    但是,您决定实现队列,请记住Queues应该提供一些使用队列的通用接口。以下是一些例子:

    1. enqueue - 在队列的后面(尾部)插入一个元素
    2. dequeue - 从非空队列的前面(头部)删除一个元素。
    3. empty - 返回队列是否为空
    4. size - 返回队列的大小
    5. 您可能希望将其他操作添加到队列中(在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)

有一些问题:

  • 您的方法被声明为Enqueue和Dequeue,但定义为enqueue和dequeue:C ++区分大小写。
  • 你的方法是指“头”,它们似乎不存在,你的意思是“头”吗?

答案 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类,并将headtail声明为Queue*类型。他们看起来不像班上的成员,他们应该是。