免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6067 | 回复: 24
打印 上一主题 下一主题

心情不好,用C写个泛形stack, 欢迎砸 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-28 13:18 |只看该作者 |倒序浏览
没写自动增加。。。反正也就是那么回事


  1. #include <stdlib.h>

  2. #define STACK_INIT_DECLARE(_stack_type_name)\
  3. int init(_stack_type_name*,int size);
  4. #define STACK_POP_DECLARE(_stack_type_name)\
  5. void pop(_stack_type_name*);
  6. #define STACK_PUSH_DECLARE( _elem_type, _stack_type_name)        \
  7. int push( _elem_type , _stack_type_name*);
  8. #define STACK_GETVALUE_DECLARE( _elem_type, _stack_type_name) \
  9. void getvalue( _elem_type* , _stack_type_name*);

  10. #define STACK_DECLARE(_elem_type, _stack_type_name, _stack_name) \
  11. typedef _elem_type        stack_elem_type; \
  12. struct _stack_type_name##_tag {_elem_type*        data;        \
  13. int pointer; int size; };  \
  14. typedef struct _stack_type_name##_tag _stack_type_name; \
  15. _stack_type_name _stack_name;\
  16. STACK_INIT_DECLARE(_stack_type_name)\
  17. STACK_POP_DECLARE(_stack_type_name)\
  18. STACK_PUSH_DECLARE(stack_elem_type, _stack_type_name)\
  19. STACK_GETVALUE_DECLARE(stack_elem_type, _stack_type_name)

  20. #define STACK_INIT_DEFINITION(_stack_type_name) \
  21. int init(_stack_type_name* stack_name,int size) { \
  22.         stack_name->data = (stack_elem_type*)malloc(size*sizeof(stack_elem_type));\
  23.         stack_name->pointer = 0;\
  24.         stack_name->size = size;\
  25.         return stack_name->data != NULL? 1:0; \
  26. }

  27. #define STACK_POP_DEFINITION(_stack_type_name) \
  28. void pop(_stack_type_name* stack_name) {\
  29.         if ( stack_name->pointer > 0) stack_name->pointer--; \
  30. }

  31. #define STACK_PUSH_DEFINITION(_stack_type_name) \
  32. int push(stack_elem_type value, _stack_type_name* stack_name) { \
  33.         if ( stack_name->pointer == stack_name->size ) { \
  34.                 return 0;         } \
  35.         stack_name->data[stack_name->pointer++] = value; \
  36.         return 1; \
  37. }
  38.        
  39. #define STACK_GETVALUE_DEFINITION(_stack_type_name) \
  40. void getvalue(stack_elem_type* getvalue, _stack_type_name* stack_name) {\
  41.         if ( stack_name->pointer >0 ) *(getvalue) = stack_name->data[stack_name->pointer-1]; \
  42. }

  43. #define STACK_DESTROY_DEFINITION(_stack_type_name) \
  44. void destroy(_stack_type_name* stack_name) { \
  45.         free(stack_name->data); \
  46. }

  47. #define STACK_DEFINITION(_stack_type_name) \
  48. STACK_INIT_DEFINITION(_stack_type_name) \
  49. STACK_POP_DEFINITION(_stack_type_name) \
  50. STACK_PUSH_DEFINITION( _stack_type_name) \
  51. STACK_GETVALUE_DEFINITION(_stack_type_name) \
  52. STACK_DESTROY_DEFINITION(_stack_type_name)

  53. #define INIT(_stack_name, _size) \
  54. init(&_stack_name, _size);

  55. #define POP(_stack_name) \
  56. pop(&_stack_name);

  57. #define PUSH(_elem_value, _stack_name) \
  58. push(_elem_value, &_stack_name);

  59. #define GETVALUE(_elem_value, _stack_name) \
  60. getvalue(&_elem_value, &_stack_name);

  61. #define DESTROY(_stack_name) \
  62. destroy(_stack_name);
复制代码


  1. #include "stack.h"

  2. STACK_DECLARE(int, int_stack, stack)
  3. STACK_DEFINITION(int_stack)

  4. int main(void)
  5. {
  6.         int a;
  7.        
  8.         INIT(stack, 10)
  9.         PUSH(1, stack)
  10.         POP(stack)
  11.         PUSH(2, stack)
  12.         GETVALUE(a, stack)
  13.         return 0;
  14. }
复制代码

[ 本帖最后由 hellhell 于 2006-3-28 16:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-03-28 13:39 |只看该作者
这样子的代码没法看了....

论坛徽章:
0
3 [报告]
发表于 2006-03-28 13:46 |只看该作者
忘了通用类型有时被称作泛型了,第一印象当成了“分形”

论坛徽章:
0
4 [报告]
发表于 2006-03-28 14:05 |只看该作者
用Linux源码里list的实现方式,来做通用的stack应该更加简单吧

论坛徽章:
0
5 [报告]
发表于 2006-03-29 00:04 |只看该作者
好!

原帖由 hellhell 于 2006-3-27 21:18 发表
没写自动增加。。。反正也就是那么回事


  1. #include <stdlib.h>

  2. #define STACK_INIT_DECLARE(_stack_type_name)\
  3. int init(_stack_type_name*,int size);
  4. #define STACK_POP_DECLARE(_stack_t ...
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-03-29 01:08 |只看该作者
  1. stack<int> si; stack<double>sd;
复制代码
This is hardly possible with macro implementation...:wink:

论坛徽章:
0
7 [报告]
发表于 2006-03-30 14:47 |只看该作者
原帖由 wolf0403 于 2006-3-29 01:08 发表
  1. stack<int> si; stack<double>sd;
复制代码
This is hardly possible with macro implementation...:wink:


最不爽的就是C不支持运算符重载, 否则我们通过重载下标运算符[], 就可以实现一个相当不错的STL vector

论坛徽章:
0
8 [报告]
发表于 2006-03-31 16:55 |只看该作者
有个鸟用

论坛徽章:
0
9 [报告]
发表于 2006-03-31 17:35 |只看该作者
原帖由 liu2linux 于 2006-3-31 16:55 发表
有个鸟用

就为你这句回复, 先锁你这个ID两天。

不会做人的孩子可真不少

论坛徽章:
0
10 [报告]
发表于 2006-03-31 20:31 |只看该作者
原帖由 albcamus 于 2006-3-31 17:35 发表

就为你这句回复, 先锁你这个ID两天。

不会做人的孩子可真不少


说不定这个是牛人呢,黑客最喜欢简洁,这个代码是不好看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP