GLib堆栈数据类型?

时间:2017-07-20 09:48:07

标签: c stack glib lifo

GLib是否具有可用作LIFO(堆栈)集合的数据类型? It does have列表,队列,哈希表等,但我似乎找不到堆栈数据类型。

有一个垃圾堆栈类型,但它的设计考虑了特定目的,自版本2.48以来也被弃用。

什么可以用作GLib中的堆栈?

2 个答案:

答案 0 :(得分:3)

从未使用它,但从文档中你应该能够使用双端队列。要使用g_queue_push_head()并使用g_queue_pop_head()从堆栈弹出,请参阅:https://people.gnome.org/~desrt/glib-docs/glib-Double-ended-Queues.html

答案 1 :(得分:1)

我需要同样的东西,所以我写了一个简单的例子:

// An example stack in glib using a Queue. As this example uses
// integers, we make use of the glib GPOINTER_TO_UINT macros.
//
// Compile by:
//    cc `pkg-config --cflags --libs glib-2.0` -o test-stack test-stack.c

#include <glib.h>
#include <stdio.h>
#include <stdint.h>

void pintqueue(GQueue *q)
{
    int i;
    printf("[%d] ", q->length);

    GList *h = q->head;

    for (i=0; i<q->length; i++) {
        printf("%d ", (int)GPOINTER_TO_UINT(h->data));
        h=h->next;
    }
    printf("\n");
}

void qintpush(GQueue *q, gint val)
{
    g_queue_push_tail(q, GUINT_TO_POINTER((guint)val));
}

gint qintpop(GQueue *q)
{
    if (q->length==0) {
        // "Error handling"
        g_message("Ooops! Trying to pop from an empty stack!");
        return INT_MAX;
    }
    return (gint)(GPOINTER_TO_UINT(g_queue_pop_tail(q)));
}

gint main(int argc, char **argv)
{
    GQueue q = G_QUEUE_INIT;

    qintpush(&q, 34);
    qintpush(&q, 42);
    qintpush(&q, -1);

    pintqueue(&q);

    printf("Popped: %d\n", qintpop(&q));
    pintqueue(&q);

    for (int i=0; i<5; i++)
        printf("Popped: %d\n", qintpop(&q));

    exit(0);
}