2019独角兽企业重金招聘Python工程师标准>>>

1:结构

typedef struct {GList *head;GList *tail;guint length;} GQueue;

2:原型

GQueue* g_queue_new (void);void g_queue_free (GQueue *queue);#define G_QUEUE_INITvoid g_queue_init (GQueue *queue);void g_queue_clear (GQueue *queue);gboolean g_queue_is_empty (GQueue *queue);guint g_queue_get_length (GQueue *queue);void g_queue_reverse (GQueue *queue);GQueue* g_queue_copy (GQueue *queue);void g_queue_foreach (GQueue *queue,GFunc func,gpointer user_data);GList* g_queue_find (GQueue *queue,gconstpointer data);GList* g_queue_find_custom (GQueue *queue,gconstpointer data,GCompareFunc func);void g_queue_sort (GQueue *queue,GCompareDataFunc compare_func,gpointer user_data);void g_queue_push_head (GQueue *queue,gpointer data);void g_queue_push_tail (GQueue *queue,gpointer data);void g_queue_push_nth (GQueue *queue,gpointer data,gint n);gpointer g_queue_pop_head (GQueue *queue);gpointer g_queue_pop_tail (GQueue *queue);gpointer g_queue_pop_nth (GQueue *queue,guint n);gpointer g_queue_peek_head (GQueue *queue);gpointer g_queue_peek_tail (GQueue *queue);gpointer g_queue_peek_nth (GQueue *queue,guint n);gint g_queue_index (GQueue *queue,gconstpointer data);void g_queue_remove (GQueue *queue,gconstpointer data);void g_queue_remove_all (GQueue *queue,gconstpointer data);void g_queue_insert_before (GQueue *queue,GList *sibling,gpointer data);void g_queue_insert_after (GQueue *queue,GList *sibling,gpointer data);void g_queue_insert_sorted (GQueue *queue,gpointer data,GCompareDataFunc func,gpointer user_data);void g_queue_push_head_link (GQueue *queue,GList *link_);void g_queue_push_tail_link (GQueue *queue,GList *link_);void g_queue_push_nth_link (GQueue *queue,gint n,GList *link_);GList* g_queue_pop_head_link (GQueue *queue);GList* g_queue_pop_tail_link (GQueue *queue);GList* g_queue_pop_nth_link (GQueue *queue,guint n);GList* g_queue_peek_head_link (GQueue *queue);GList* g_queue_peek_tail_link (GQueue *queue);GList* g_queue_peek_nth_link (GQueue *queue,guint n);gint g_queue_link_index (GQueue *queue,GList *link_);void g_queue_unlink (GQueue *queue,GList *link_);void g_queue_delete_link (GQueue *queue,GList *link_);

3:实例

#include <stdio.h>#include <glib.h>#include <glib/gprintf.h>struct map {int key;char *value;} m[10] = {{0,"zero"},{1,"one"},{2,"two"},{3,"three"},{4,"four"},{5,"five"},{6,"six"},{7,"seven"},{8,"eight"},{9,"nine"},};typedef struct map map;static voidmyPrintInt(gpointer p1, gpointer fmt){g_printf(fmt, *(gint *)p1);}static voidmyPrintStr(gpointer p1, gpointer fmt){g_printf(fmt, (gchar *)p1);}static voidtest_queue_1(void){// GQueue* g_queue_new(void);GQueue *queue = g_queue_new();// gboolean g_queue_is_empty(GQueue *queue);gboolean b = g_queue_is_empty(queue);g_printf("The queue should be empty now.\t\tResult: %s.\n", b ? "YES" : "NO");// void g_queue_push_tail(GQueue *queue, gpointer data);gint i;for (i = 0; i < sizeof (m) / sizeof (m[0]); i++)g_queue_push_tail(queue, m[i].value);// void g_queue_foreach(GQueue *queue, GFunc func, gpointer user_data);g_printf("Now the queue[after push tail] :\n");g_queue_foreach(queue, myPrintStr, "%s, ");g_printf("\n");// guint g_queue_get_length(GQueue *queue);g_printf("The lenght should be '%d' now.\t\tResult: %d.\n", 10, g_queue_get_length(queue));// void g_queue_reverse(GQueue *queue);g_queue_reverse(queue);g_printf("Now the queue[after reverse] :\n");g_queue_foreach(queue, myPrintStr, "%s, ");g_printf("\n");// gpointer g_queue_pop_head(GQueue *queue);g_printf("The head should be '%s' now.\t\tResult: %s.\n", "nine", (gchar *)g_queue_pop_head(queue));// gpointer g_queue_pop_tail(GQueue *queue);g_printf("The tail should be '%s' now.\t\tResult: %s.\n", "zero", (gchar *)g_queue_pop_tail(queue));g_printf("Now the queue[after pop head and tail] :\n");g_queue_foreach(queue, myPrintStr, "%s, ");g_printf("\n");// gpointer g_queue_pop_nth(GQueue *queue, guint n);g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_pop_nth(queue, 0));// void g_queue_push_head(GQueue *queue, gpointer data);g_queue_push_head(queue, "zero");g_queue_push_head(queue, "eight");// void g_queue_push_nth(GQueue *queue, gpointer data, gint n);g_queue_push_nth(queue, "nine", 2);g_printf("Now the queue[after push 'zero' 'eight' 'nine'] :\n");g_queue_foreach(queue, myPrintStr, "%s, ");g_printf("\n");// gpointer g_queue_peek_head(GQueue *queue);g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_peek_head(queue));// gpointer g_queue_peek_tail(GQueue *queue);g_printf("The tail should be '%s' now.\t\tResult: %s.\n", "zero", (gchar *)g_queue_peek_tail(queue));// gpointer g_queue_peek_nth(GQueue *queue, guint n);g_printf("The head should be '%s' now.\t\tResult: %s.\n", "eight", (gchar *)g_queue_peek_nth(queue, 0));/*// void g_queue_clear(GQueue *queue);g_queue_clear(queue);g_printf("Now the queue[after clear] :\n");g_queue_foreach(queue, myPrintStr, "%s, ");g_printf("\n");*/// void g_queue_free(GQueue *queue);g_queue_free(queue);}static gintsort(gconstpointer p1, gconstpointer p2, gpointer user_data){gint32 a, b;a = *(gint*)(p1);b = *(gint*)(p2);return (a > b ? +1 : a == b ? 0 : -1);}static gintmyCompareInt(gconstpointer p1, gconstpointer p2){const int *a = p1;const int *b = p2;return *a - *b;}static gintsort_r(gconstpointer p1, gconstpointer p2, gpointer user_data){gint32 a, b;a = *(gint*)(p1);b = *(gint*)(p2);return (a < b ? +1 : a == b ? 0 : -1);}static voidtest_queue_2(void){GQueue *queue = NULL;/*// void g_queue_init(GQueue *queue);g_queue_init(queue);*/queue = g_queue_new();// void g_queue_insert_sorted(GQueue *queue, gpointer data, GCompareDataFunc func gpointer user_data);gint i;for (i = 0; i < sizeof (m) / sizeof (m[0]); i++)g_queue_insert_sorted(queue, &m[i].key, sort_r, NULL);g_printf("Now the queue[after insert sorted] :\n");for (i = 0; i < queue->length; i++)g_printf("%d, ", *(gint *)g_queue_peek_nth(queue, i));g_printf("\n");// void g_queue_remove(GQueue *queue, gconstpointer data);g_queue_remove(queue, &m[3].key);g_printf("Now the queue[after remove '%d'] :\n", m[3].key);for (i = 0; i < queue->length; i++)g_printf("%d, ", *(gint *)g_queue_peek_nth(queue, i));g_printf("\n");// GList* g_queue_find_custom(GQueue *queue, gconstpointer data, GCompareFunc func);// void g_queue_insert_before(GQueue *queue, GList *sibling, gpointer data);// void g_queue_insert_after(GQueue *queue, GList *sibling, gpointer data);g_queue_insert_before(queue, g_queue_find_custom(queue, &m[5].key, myCompareInt), &m[3].key);g_queue_insert_after(queue, g_queue_find_custom(queue, &m[5].key, myCompareInt), &m[3].key);g_printf("Now the queue[after insert '%d' around '%d'] :\n", m[3].key, m[5].key);g_queue_foreach(queue, myPrintInt, "%d, ");g_printf("\n");// void g_queue_sort(GQueue *queue, GCompareDataFunc compare, gpointer user_data);g_queue_sort(queue, sort, NULL);g_printf("Now the queue[sorted] :\n");g_queue_foreach(queue, myPrintInt, "%d, ");g_printf("\n");// GQueue* g_queue_copy(GQueue *queue);GQueue *q = g_queue_copy(queue);g_printf("Now the queue[copy] :\n");g_queue_foreach(q, myPrintInt, "%d, ");g_printf("\n");// void g_queue_remove_all(GQueue *queue, gconstpointer data);g_queue_remove_all(q, &m[3].key);g_printf("Now the queue[remove '%d'] :\n", m[3].key);g_queue_foreach(q, myPrintInt, "%d, ");g_printf("\n");g_queue_free(q);g_queue_free(queue);}intmain(void){printf("BEGIN:\n************************************************************\n");printf("\n------------------------------------------------------------\ntest_queue_1:\n");test_queue_1();printf("------------------------------------------------------------\n");printf("\n------------------------------------------------------------\ntest_queue_2:\n");test_queue_2();printf("------------------------------------------------------------\n");printf("\n************************************************************\nDONE\n");return 0;}

4:结果

[xied1@soho use]$ gcc `pkg-config --cflags --libs glib-2.0` -Wall -O2 -o queue queue.c[xied1@soho use]$ ./queueBEGIN:************************************************************------------------------------------------------------------test_queue_1:The queue should be empty now. Result: YES.Now the queue[after push tail] :zero, one, two, three, four, five, six, seven, eight, nine,The lenght should be '10' now. Result: 10.Now the queue[after reverse] :nine, eight, seven, six, five, four, three, two, one, zero,The head should be 'nine' now. Result: nine.The tail should be 'zero' now. Result: zero.Now the queue[after pop head and tail] :eight, seven, six, five, four, three, two, one,The head should be 'eight' now. Result: eight.Now the queue[after push 'zero' 'eight' 'nine'] :eight, zero, nine, seven, six, five, four, three, two, one,The head should be 'eight' now. Result: eight.The tail should be 'zero' now. Result: one.The head should be 'eight' now. Result: eight.------------------------------------------------------------------------------------------------------------------------test_queue_2:Now the queue[after insert sorted] :9, 8, 7, 6, 5, 4, 3, 2, 1, 0,Now the queue[after remove '3'] :9, 8, 7, 6, 5, 4, 2, 1, 0,Now the queue[after insert '3' around '5'] :9, 8, 7, 6, 3, 5, 3, 4, 2, 1, 0,Now the queue[sorted] :0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9,Now the queue[copy] :0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9,Now the queue[remove '3'] :0, 1, 2, 4, 5, 6, 7, 8, 9,------------------------------------------------------------************************************************************DONE

5:小结

  • 创建: g_queue_new()
  • 入队: g_queue_push_head() g_queue_push_tail()
  • 出队: g_queue_pop_head() g_queue_pop_tail()
  • 销毁: g_queue_free()

转载于:https://my.oschina.net/iamhere/blog/493150

Glib实例学习(6)双端队列相关推荐

  1. C++ 双端队列(deque)的使用

    双端队列(deque)是什么 双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除的功能,deque类似于vector, 双端队列(deque)属于STL(Standard ...

  2. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

  3. python数据结构与算法:队列与双端队列

    双端队列: #################队列#################### #coding:utf-8 """ Deque() 创建一个空的双端队列 ad ...

  4. LeetCode实战:设计循环双端队列

    题目英文 Design your implementation of the circular double-ended queue (deque). Your implementation shou ...

  5. 数据结构之队列、双端队列

    数据结构之队列.双端队列 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First in First Out)的线性表,简称FIFO.允许插入的 ...

  6. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

  7. java lifo 队列_1.8 Java 队列 Queue、双端队列 Deque - Java 知识总结与学习

    queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.除了基本的 Collection 操作外,队列还 ...

  8. HDU 4286 Data Handler [栈,双端队列]

    这题比较容易想到的做法是splay,但是splay写起来比较麻烦而且每次操作都有LogN的复杂度,双向链表也是可以实现的,但实践起来比较麻烦,尤其是翻转操作... 可以发现每次L或者R都是移动一位的, ...

  9. bzoj 2457 [BeiJing2011]双端队列 模拟+贪心

    [BeiJing2011]双端队列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 457  Solved: 203 [Submit][Status] ...

  10. 堆和栈组合:双端队列c++

    双端队列(Deque:double ended queue)就是一个两端都是结尾的队列.队列的每一端都可以插入数据项和移除数据项.相对于普通队列,双端队列的入队和出队操作在两端都可进行. 双端队列的示 ...

最新文章

  1. 在CentOS/Debian/Ubuntu上编译安装最新版gnu make 和GNU 'binutils' (as and ld)
  2. 4个提高深度学习模型性能的技巧
  3. webclientt和httpwebrequest
  4. 技术达人“创造营”官宣:Microsoft Learn 学习平台C位出道
  5. Spring模板对象
  6. 剑指offer——面试题39:二叉树的深度
  7. 基于C#的MongoDB数据库开发应用(2)--MongoDB数据库的C#开发
  8. 循环神经网络 递归神经网络_递归神经网络-第2部分
  9. 信息差、技能差、资源差、认知差
  10. [ Linux驱动炼成记 ] 12 -音频驱动TAS5754添加EQ参数
  11. [架构之美]一款APP从想法-开发-上线-产品的全过程
  12. Acme CAD Converter 2019(DWG转换器) v8.9.8.1500简体中文精简优化版
  13. java war文件_java – 使用参数部署* .war文件
  14. 游戏类型英文简称/全称对照表
  15. python setup_python--setUp()和tearDown()应用
  16. 最新苹果服务器认证,Sign in with Apple-苹果登录(客户端和服务端)
  17. QT使用log4cpp日志库
  18. NUC972触摸屏驱动移植过程分析(二)
  19. cocoscreator getSpriteFrame is not a function 问题
  20. .com 域名三十年回顾:从 1 到 1 亿个,一部互联网的变迁史

热门文章

  1. python 跳水板
  2. Android之----Log详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  3. 数据库的主键ID设置为自动增加,删除记录后的记录还是递增的,如何重新从1开始增加呢?
  4. springboot mybatis 事务_SpringBoot 下 Mybatis 的缓存
  5. c语言编写二次方程求根程序,一元二次方程求解程序完整代码
  6. java 实例变量初始化_java学习之实例变量初始化
  7. 答答租车系统(面向对象综合练习)_JAVA
  8. Java8 Predicate接口
  9. 9.匿名函数:lambda表达式/filter()/map()
  10. 【C++】18.char[] 与 string 的区别 与 互相转化、c_str() 函数用法