当前位置:   article > 正文

链式栈C语言实现详解_c语言栈的链式实现

c语言栈的链式实现

目录

一、栈基础知识

二、链式栈数据结构

三、链式栈操作函数声明

四、创建链式栈

1、栈头部动态创建

2、栈头部静态创建

五、出栈

六、入栈

七、栈删除

八、栈销毁

九、验证程序


一、栈基础知识

在上一篇的顺序栈中已经讲解过了栈的基础知识,这篇主要来讲一下栈的另一种结构 --- 链式栈,本文使用的链表结构为单向链表,当然了也可以使用双向链表来实现;对于栈的入栈采用的就是头插法添加节点的方式,将链表头指向栈顶,这样在出栈的时候就直接将链表头指向的数据pop出去,然后再将链表头(栈顶)向后移动,可以很方便的实现后进先出的操作

二、链式栈数据结构

  1. #define LIST_STACK_NUM(pstack) (pstack->num)
  2. #define LIST_STACK_IS_EMPTY(pstack) (pstack->top == NULL)
  3. struct list_stack_node
  4. {
  5. struct list_stack_node *next; /* next node*/
  6. int value_size; /* value size */
  7. void *value; /* node value */
  8. };
  9. struct list_stack
  10. {
  11. struct list_stack_node *top; /* stack top */
  12. int num; /* stack node num */
  13. };

三、链式栈操作函数声明

  1. extern struct list_stack* list_stack_creat(void);
  2. extern int list_stack_init (struct list_stack *stack);
  3. extern int list_stack_empty (struct list_stack *stack);
  4. extern int list_stack_destory(struct list_stack *stack);
  5. extern int list_stack_pop (struct list_stack *stack, void *out_data);
  6. extern int list_stack_push(struct list_stack *stack, void *in_data, int dsize);
  7. extern void list_stack_test(void);

四、创建链式栈

1、栈头部动态创建

  1. /**
  2. * dynamically create a list stack.
  3. *
  4. * @return NULL:malloc fail
  5. * !NULL:success
  6. */
  7. struct list_stack* list_stack_creat(void)
  8. {
  9. struct list_stack *stack = NULL;
  10. stack = LIST_STACK_CALLOC(1,sizeof(*stack));
  11. if (stack == NULL)
  12. return NULL;
  13. stack->top = NULL;
  14. stack->num = 0;
  15. return stack;
  16. }

2、栈头部静态创建

  1. /**
  2. * init a list stack.
  3. *
  4. * @param stack:list stack
  5. * @return -1:stack is null
  6. * 0:success
  7. */
  8. int list_stack_init(struct list_stack *stack)
  9. {
  10. if (stack == NULL)
  11. return -1;
  12. stack->top = NULL;
  13. stack->num = 0;
  14. return 0;
  15. }

五、出栈

  1. /**
  2. * pop data from the array stack.
  3. *
  4. * @param list_stack: array stack
  5. * @return -1: fail
  6. * -2: stack is empty
  7. * 0: success
  8. */
  9. int list_stack_pop (struct list_stack *stack, void *out_data)
  10. {
  11. struct list_stack_node *node = NULL;
  12. if (stack == NULL)
  13. return -1;
  14. if (LIST_STACK_IS_EMPTY(stack))
  15. return -2;
  16. node = stack->top;
  17. stack->top = node->next;
  18. stack->num--;
  19. memcpy(out_data, node->value, node->value_size);
  20. LIST_STACK_FREE(node->value);
  21. LIST_STACK_FREE(node);
  22. node->value = NULL;
  23. node = NULL;
  24. return 0;
  25. }

六、入栈

  1. /**
  2. * push data to the list stack forward stack top.
  3. *
  4. * @param stack: list stack
  5. * @param in_data: push data
  6. * @return -1: fail
  7. * 0: success
  8. */
  9. int list_stack_push(struct list_stack *stack, void *in_data, int dsize)
  10. {
  11. struct list_stack_node *node = NULL;
  12. if (stack == NULL)
  13. return -1;
  14. /* malloc node space */
  15. node = LIST_STACK_MALLOC(sizeof(*node));
  16. if (node == NULL)
  17. return -1;
  18. /* malloc value space */
  19. node->value = LIST_STACK_MALLOC(dsize);
  20. if (node->value == NULL)
  21. return -1;
  22. memcpy(node->value, in_data, dsize);
  23. node->value_size = dsize;
  24. node->next = stack->top;
  25. stack->top = node;
  26. stack->num++;
  27. return 0;
  28. }

七、栈删除

  1. /**
  2. * delete list stack space.
  3. *
  4. * @param stack: list stack
  5. * @return -1: fail
  6. * 0:success
  7. */
  8. int list_stack_empty(struct list_stack *stack)
  9. {
  10. struct list_stack_node *node = NULL;
  11. if (stack == NULL)
  12. return -1;
  13. while (!LIST_STACK_IS_EMPTY(stack))
  14. {
  15. node = stack->top;
  16. stack->top = node->next;
  17. stack->num--;
  18. LIST_STACK_FREE(node->value);
  19. node->value = NULL;
  20. LIST_STACK_FREE(node);
  21. node = NULL;
  22. }
  23. return 0;
  24. }

八、栈销毁

  1. /**
  2. * delete and destroy a list stack.
  3. *
  4. * @param stack: list stack
  5. * @return -1: fail
  6. * 0:success
  7. */
  8. int list_stack_destory(struct list_stack *stack)
  9. {
  10. if (list_stack_empty(stack) != 0)
  11. return -1;
  12. LIST_STACK_FREE(stack);
  13. stack = NULL;
  14. return 0;
  15. }

九、验证程序

  1. struct list_stack *list_stack_head;
  2. int list_stack_w[5] = {11,22,33,44,55};
  3. int list_stack_r[5] = {0};
  4. void list_stack_test(void)
  5. {
  6. list_stack_head = list_stack_creat();
  7. list_stack_push(list_stack_head, (void*)&list_stack_w[0], 4);
  8. list_stack_push(list_stack_head, (void*)&list_stack_w[1], 4);
  9. list_stack_push(list_stack_head, (void*)&list_stack_w[2], 4);
  10. list_stack_push(list_stack_head, (void*)&list_stack_w[3], 4);
  11. list_stack_push(list_stack_head, (void*)&list_stack_w[4], 4);
  12. list_stack_pop(list_stack_head, (void*)&list_stack_r[0]);
  13. list_stack_pop(list_stack_head, (void*)&list_stack_r[1]);
  14. list_stack_pop(list_stack_head, (void*)&list_stack_r[2]);
  15. list_stack_pop(list_stack_head, (void*)&list_stack_r[3]);
  16. list_stack_pop(list_stack_head, (void*)&list_stack_r[4]);
  17. list_stack_push(list_stack_head, (void*)&list_stack_w[0], 4);
  18. list_stack_pop(list_stack_head, (void*)&list_stack_r[0]);
  19. list_stack_push(list_stack_head, (void*)&list_stack_w[1], 4);
  20. list_stack_pop(list_stack_head, (void*)&list_stack_r[1]);
  21. list_stack_push(list_stack_head, (void*)&list_stack_w[2], 4);
  22. list_stack_pop(list_stack_head, (void*)&list_stack_r[2]);
  23. list_stack_push(list_stack_head, (void*)&list_stack_w[3], 4);
  24. list_stack_pop(list_stack_head, (void*)&list_stack_r[3]);
  25. list_stack_push(list_stack_head, (void*)&list_stack_w[4], 4);
  26. list_stack_pop(list_stack_head, (void*)&list_stack_r[4]);
  27. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/905897
推荐阅读
相关标签
  

闽ICP备14008679号