C语言中用宏设计的“泛型”堆栈
每次项目当要用到堆栈时要么会重新写个要么把以前的拷贝过来换个类型,一直在想能不能用C语言做个通用的数据结构库,像C++中的STL一样。要在C语言突破类型的限制以我目前的知识水平能想到的用宏了,后来查到了#define中##的用法。后来就产生了下面这段代码:
- #define __p_start do{
- #define __p_end }while(0);
- #define p_stack(_s, _t, _n) typedef _t type_##_s; \
- type_##_s _buf_##_s[_n]; \
- int _max_##_s = _n-1; \
- int _top_##_s = -1
- #define p_empty(_s) (_top_##_s < 0)
- #define p_full(_s) (_top_##_s >= _max_##_s)
- #define p_push(_s, _x) (!p_full(_s) ? (_buf_##_s[++(_top_##_s)]= _x, 1) : 0)
- #define p_pop(_s) (!p_empty(_s) ? ((_top_##_s)--, 1) : 0)
- #define p_top(_s) (!p_empty(_s) ? _buf_##_s[_top_##_s] : (type_##_s)0)
- __p_start
- p_stack(s1, int, 16);
- for(i = 0; i < 16; i++)
- p_push(s1, i+1);
- __p_start
- p_stack(s2, float, 16);
- for(i = 0; i < 16; i++)
- p_push(s2, (float)i*i / 2.0f);
- for(i = 0; i < 16; i++)
- printf("s1[%d]=%d, s2[%d]=%f\n", i, p_top(s1), i, p_top(s2));
- __p_end
- __p_end
后来考虑到__p_start不能带;号与C语言语法有点冲突,改进如下:
- #define p_stack_start(_s, _t, _n) do{ \
- typedef _t type_##_s; \
- type_##_s _buf_##_s[_n]; \
- int _max_##_s = _n-1; \
- int _top_##_s = -1
- #define p_stack_end(_s) _max_##_s = 0;_top_##_s = -1; \
- }while(0)
- #define p_empty(_s) (_top_##_s < 0)
- #define p_full(_s) (_top_##_s >= _max_##_s)
- #define p_push(_s, _x) (!p_full(_s) ? (_buf_##_s[++(_top_##_s)]= _x, 1) : 0)
- #define p_pop(_s) (!p_empty(_s) ? ((_top_##_s)--, 1) : 0)
- #define p_top(_s) (!p_empty(_s) ? _buf_##_s[_top_##_s] : (type_##_s)0)
用法如下:
- p_stack_start(s1, int, 16);
- for(i = 0; i < 16; i++)
- p_push(s1, i+1);
- for(i = 0; i < 16; i++)
- {
- printf("[%d]=%d\n", 16-i, p_top(s1));
- p_pop(s1);
- }
- p_stack_end(s1);
每个堆栈的作用域在p_stack_start和p_end之间,目前这个还有个小bug就是关于p_top的返回如果是int型的,那么返回0就有可能和堆栈里面的数据值一样不能识别了。目前能想到的也只有此了,刚还做了个同样的队列,对于链表这个还没想好,而且也不太合适,主要是链表的代码更复杂直接用宏的话太牵强了,如果大家有更好的方法也可以共享一下。
相关推荐
chensen 2020-11-14
拉斯厄尔高福 2020-11-04
杜倩 2020-10-29
拉斯厄尔高福 2020-10-19
嵌入式资讯精选 2020-10-15
zhaochen00 2020-10-13
penkgao 2020-10-13
yiyilanmei 2020-10-05
wanshiyingg 2020-09-29
Mars的自语 2020-09-27
shenwenjie 2020-09-24
一个逗逗 2020-09-22
flycony 2020-09-13
zhaochen00 2020-08-20
Biao 2020-08-20
qingsongzdq 2020-08-19
penkgao 2020-08-17
cetrolchen 2020-08-14
GuoSir 2020-08-07