【问题标题】:Are there standard Queue implementations for C?C 有标准的队列实现吗?
【发布时间】:2011-05-10 06:07:53
【问题描述】:

是否有任何队列数据结构实现是 C“附带”的,还是我必须自己开发(这是针对学校项目的,因此我必须使用标准 gcc 安装中存在的东西,或者必须实现一个我一个人!)

其他通用数据结构如链表、堆栈等呢?

【问题讨论】:

标签: c unix data-structures


【解决方案1】:

您必须实现自己的。 C 在数据结构方面几乎没有,它迫使你诉诸可争论的技巧来实现抽象数据类型:如果你能找到标题为“作为抽象的不完整类型”的文章,或者看看这些原则是如何应用的,比如, PolarSSL's bignum.h file。另一方面,C++ 应该允许您做几乎所有可以在 C 中做的事情,并为您提供实现抽象数据结构的方法。

【讨论】:

  • ...而C++无论如何在STL中有一个队列类型。
【解决方案2】:

您必须实现自己的数据结构,但是那里存在许多数据结构库。

【讨论】:

    【解决方案3】:

    您可以使用named pipe。它是一种 FIFO 数据结构,是 posix 标准的一部分。如果你想要的只是排到后面并从前面移除,它会起作用。不过,您需要手动跟踪消息边界,也许通过让第一个元素成为下一条消息中的字节数。

    【讨论】:

    • 这会很慢且不可移植,并且需要了解 Unix 系统调用才能对其进行调试。
    • @larsmans:但是我认为考虑到问题标签,这是一个公平的答案。
    【解决方案4】:

    试试这个。 Unix 带有多种链表 - 您可以使用其中一种来创建其他可能基于列表的结构,例如堆栈。

    man queue
    

    【讨论】:

    • +1,说明这不是标准接口。不过,Linux、BSD 和我认为 Mac OS X 提供了它。
    • 技术上不是正确的答案,但这绝对是有帮助的^_^
    【解决方案5】:

    不是完全标准,但许多系统都有 bsd/sys/queue.hbsd/sys/tree.h 是基于宏的库。

    请参阅documentation here

    【讨论】:

      【解决方案6】:

      使用 BSB 库。 sys/queue.h 和 sys/tree.h 有各种列表和树的实现。

      【讨论】:

        【解决方案7】:

        没有。但这里有一个非常简单的实现:

        typedef struct node {
           int val;
           struct node *next;
        } node_t;
        
        void enqueue(node_t **head, int val) {
           node_t *new_node = malloc(sizeof(node_t));
           if (!new_node) return;
        
           new_node->val = val;
           new_node->next = *head;
        
           *head = new_node;
        }
        
        int dequeue(node_t **head) {
           node_t *current, *prev = NULL;
           int retval = -1;
        
           if (*head == NULL) return -1;
        
           current = *head;
           while (current->next != NULL) {
              prev = current;
              current = current->next;
           }
        
           retval = current->val;
           free(current);
        
           if (prev)
              prev->next = NULL;
           else
              *head = NULL;
        
           return retval;
        }
        

        完整来源here

        【讨论】:

          【解决方案8】:

          GLib(不要与 glibc 混淆)实现了许多常见的数据结构,包括双端队列。与FreeBSD's macro-based queues 不同,GLib's GQueues 基于可能更易于调试和类型检查的函数。

          https://developer.gnome.org/glib/stable/glib-Double-ended-Queues.html

          【讨论】:

            猜你喜欢
            • 2010-12-03
            • 1970-01-01
            • 2012-02-28
            • 2018-01-22
            • 1970-01-01
            • 2011-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多