免费注册 查看新帖 |

Chinaunix

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

[C] 发两个栈的代码,有兴趣的来看看 [复制链接]

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-07 22:21 |只看该作者 |倒序浏览
本帖最后由 vbs100 于 2010-02-07 22:32 编辑
  1. $ cat stack1.c
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define STACK_INIT_SIZE        5
  5. #define STACKINCREMENT        5

  6. typedef struct {
  7.         void **base;
  8.         void **top;
  9.         int stacksize;
  10. } stack_t;

  11. void InitStack(stack_t *s){
  12.         s->base = malloc(STACK_INIT_SIZE * sizeof(void *));
  13.         if(!s->base) abort();
  14.         s->top = s->base;
  15.         s->stacksize = STACK_INIT_SIZE;
  16. }

  17. void Peak(stack_t *s, void **p){
  18.         if(s->base == s->top)
  19.                 *p = NULL;
  20.         else
  21.                 *p = *(s->top - 1);
  22. }

  23. void Push(stack_t *s, void *p){
  24.         if(s->top - s->base >= s->stacksize){
  25.                 s->base = realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(void *));
  26.                 if(!s->base) abort();
  27.                 s->top = s->base + s->stacksize;
  28.                 s->stacksize += STACKINCREMENT;
  29.         }

  30.         *s->top++ = p;
  31. }

  32. void Pop(stack_t *s, void **p){
  33.         if(s->base == s->top)
  34.                 *p = NULL;
  35.         else
  36.                 *p = *--s->top;
  37. }

  38. typedef struct {
  39.         char name[16];
  40.         int value;
  41. }data_t;

  42. int main()
  43. {
  44.         int i;
  45.         stack_t S;
  46.         data_t *d1, *d2;

  47.         InitStack(&S);

  48.         for(i = 0; i < 20; i++)
  49.         {
  50.                 d1 = malloc(sizeof(data_t));
  51.                 sprintf(d1->name,"%d * %d = ", i, i);
  52.                 d1->value = i * i;
  53.                 Push(&S, d1);
  54.         }

  55.         Peak(&S, (void **)&d2);
  56.         if(d2) printf("%s%d\n", d2->name, d2->value);

  57.         for(i = 0; i < 30; i++)
  58.         {
  59.                 Pop(&S, (void **)&d2);
  60.                 if(!d2) break;
  61.                 printf("%s%d\n", d2->name, d2->value);
  62.                 free(d2);
  63.         }

  64. }
复制代码
  1. $ cat stack2.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/queue.h>

  5. typedef struct {
  6.         char name[16];
  7.         int value;
  8. }data_t;

  9. SLIST_HEAD(stack, node);
  10. struct node {
  11.         data_t data;
  12.         SLIST_ENTRY(node) p;
  13. };

  14. int main()
  15. {
  16.         int i;
  17.         struct stack S;
  18.         struct node *n1, *n2;

  19.         SLIST_INIT(&S);

  20.         for(i = 0; i < 20; i++)
  21.         {
  22.                 n1 = malloc(sizeof(struct node));
  23.                 sprintf(n1->data.name,"%d * %d = ", i, i);
  24.                 n1->data.value = i * i;
  25.                 SLIST_INSERT_HEAD(&S, n1, p);
  26.         }

  27.         n2 = SLIST_FIRST(&S);
  28.         if(n2) printf("%s%d\n", n2->data.name, n2->data.value);

  29.         for(i = 0; i < 30; i++)
  30.         {
  31.                 n2 = SLIST_FIRST(&S);
  32.                 if(!n2) break;
  33.                 printf("%s%d\n", n2->data.name, n2->data.value);
  34.                 SLIST_REMOVE_HEAD(&S, p);
  35.                 free(n2);
  36.         }

  37. }
复制代码
stack1.c 出自严蔚敏的书里,并稍做修改,我考虑的主要是减少数据拷贝,如果出入栈的数据是原子型,那还是用原书的代码吧
stack2.c 是queue.h的使用例子吧,我写出来主要是想是和上面代码进行比较,大家如果有更好的实现不妨也拿出来分享下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP