【问题标题】:implement a queue实现一个队列
【发布时间】:2009-05-16 21:47:47
【问题描述】:

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

我试图弄清楚为什么编译器告诉我我有多重定义 “头”和“尾”——没有成功。

edit:当编译器给出错误消息时,它会打开一个 locale_facets.tcc 文件 来自我不知道在哪里,并说错误在以下函数的第 2497 行:

bool
 __verify_grouping(const char* __grouping, size_t __grouping_size,
        const string& __grouping_tmp)

有人有什么见解吗?

【问题讨论】:

  • 大声笑-我希望这是我的作业。我的作业是建立一个动态存储图的巨大任务。我需要这个队列来帮助我对其进行 BFS 搜索...但是点。
  • @Meir - 有什么理由你不能使用 std 队列并且必须自己实现它?听起来有点奇怪,queue 是一个非常基本且通用的标准库。
  • 你能发布整个队列类吗?
  • 这不是队列类,而是队列类中的一个函数...实际上没有变量“head”,也没有声明“tail”,所以有点难来帮助你。另外,你为什么要使用这个队列实现......你应该阅读你询问使用队列的其他问题的所有帖子。
  • 请解释为什么你不能使用 std 队列,但为什么你可以从 wordpress 中撕下一个。

标签: c++ queue


【解决方案1】:

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

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

  1. 它是一种线性数据结构 - 所有组件都排成一条直线。
  2. 它有一个增长/衰减规则 - 队列从两端添加和删除。
  3. 了解它们的构造方式不应成为使用它们的必要条件,因为它们具有可用的公共接口。

可以使用顺序数组或链接列表对队列进行建模。
如果您使用的是数组,则需要考虑一些事项,因为您在一个方向上增长,因此您最终会用完数组。然后,您可以做出一些选择(转变与增长)。如果您选择移回数组的开头(环绕),则必须确保头部和尾部不重叠。如果您选择简单地增加队列,则会浪费大量内存。

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

无论您决定实现队列,请记住队列应该提供一些通用接口来使用队列。以下是一些示例:

  1. enqueue - 在队列的尾部(尾部)插入一个元素
  2. dequeue - 从非空队列的前端(头部)移除一个元素。
  3. empty - 返回队列是否为空
  4. size - 返回队列的大小

您可能希望将其他操作添加到队列中(在 C++ 中,您可能希望在队列的前/后添加一个迭代器),但是您构建队列的方式不应该对它的操作产生影响提供。

但是,根据您希望如何使用队列,有更好的方法来构建它。通常的权衡是插入/删除时间与搜索时间。这里是a decent reference

【讨论】:

    【解决方案2】:

    如果您的分配与队列实现没有直接关系,您可能希望使用 C++ 中内置的 std::queue 类:

    #include <queue>
    
    void test() {
        std::queue<int> myQueue;
        myQueue.push(10);
        if (myQueue.size())
            myQueue.pop(); 
    }
    

    【讨论】:

      【解决方案3】:

      为什么不直接使用标准 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;
      }
      

      【讨论】:

      • 你的意思是写top而不是pop吗?感谢您的回答,这是我见过的最直接的回答。
      【解决方案4】:

      有几处不对:

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

      【讨论】:

      • 我假设您不会将此作为评论留下,因为您无法发表评论......因此我只给您 +1 以便您可以更接近评论,因为这是一个很好的评论。跨度>
      【解决方案5】:

      如果你在 BFS 中需要这个......只需使用双端队列。

      #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()

      这就是我一直这样做的方式。希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        看起来您的问题可能与以下事实有关:

        class Queue {
          // blah
        } *head, * tail;
        

        正在定义一个Queue 类,并将headtail 声明为Queue* 类型。他们看起来不像班级的成员,他们应该是。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-02
          • 2015-07-06
          • 1970-01-01
          • 2017-05-09
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 2014-04-21
          相关资源
          最近更新 更多