【 C 】用链表实现堆栈

举报
李锐博恩 发表于 2021/07/15 07:00:02 2021/07/15
【摘要】 博文: 【 C 】经典抽象数据类型(ADT)之堆栈(用静态数组实现堆栈) 【 C 】用动态数组实现堆栈 已经讲了两种方式实现堆栈,下面是最后一种方式,也就是链式方式实现堆栈。 由于只有堆栈的顶部元素才可以被访问,所以使用单链表就可以很好地实现链式堆栈。把一个新元素压入堆栈是通过在链表的起始位置添加一个元素实现的。从堆栈中弹出一个元素是通过从链表中移除第1个元素实现的。...

博文:

【 C 】经典抽象数据类型(ADT)之堆栈(用静态数组实现堆栈)

【 C 】用动态数组实现堆栈

已经讲了两种方式实现堆栈,下面是最后一种方式,也就是链式方式实现堆栈。

由于只有堆栈的顶部元素才可以被访问,所以使用单链表就可以很好地实现链式堆栈。把一个新元素压入堆栈是通过在链表的起始位置添加一个元素实现的。从堆栈中弹出一个元素是通过从链表中移除第1个元素实现的。位于链表头部的元素总是很容易被访问。

下面是用链式结构实现链表的程序:


  
  1. //一个用链表实现的堆栈,这个堆栈没有长度限制
  2. #include < stdio.h >
  3. #include < stdlib.h >
  4. #include < malloc.h >
  5. #include < assert.h >
  6. #include " stack.h "
  7. #define FALSE 0
  8. //定义一个结构以存储堆栈元素,其中link字段将指向堆栈的下一个元素
  9. typedef struct STACK_NODE
  10. {
  11. STACK_TYPE value; //这个类型是在stack.h头文件中定义的
  12. struct STACK_NODE *next;
  13. } StackNode;
  14. //指向堆栈第一个节点的指针
  15. static StackNode *stack;
  16. //create_stack
  17. void create_stack( size_t size )
  18. {
  19. }
  20. //destroy_stack
  21. void destroy_stack( void )
  22. {
  23. while( !is_empty )
  24. pop();
  25. }
  26. //push
  27. void push( STACK_TYPE value )
  28. {
  29. StackNode *new_node; //因为需要压入一个数值,所以要建立一个新节点
  30. new_node = malloc( sizeof( StackNode ) ); //为新节点分配内存
  31. assert( new_node != NULL ); //内存分配成功继续,否则退出
  32. new_node->value = value;
  33. new_node->next = stack;//new_node的指针指向前一个堆栈节点
  34. stack = new_node; //stack指针指向新节点,stack始终指向栈顶节点
  35. }
  36. //pop
  37. void pop( void )
  38. {
  39. StackNode *first_node; //这个指向节点的指针意义在于一个中间指针变量,指向栈顶节点,然后释放
  40. assert( !is_empty() );
  41. first_node = stack;
  42. stack = first_node->next;
  43. free( first_node );
  44. }
  45. //top
  46. STACK_TYPE top( void )
  47. {
  48. assert( !is_empty() );
  49. return stack->value;
  50. }
  51. //is_empty
  52. int is_empty( void )
  53. {
  54. return stack == NULL;
  55. }
  56. //is_full
  57. int is_full( void )
  58. {
  59. return FALSE; //永远不会满
  60. }

STACK_NODE结构用于把一个值和一个指针捆绑在一起,而stack变量是一个指向这些结构变量之一的指针。当stack指针为NULL时,堆栈为空,也就是初始时的状态。

提示:destroy_stack 函数连续从堆栈中弹出元素,直到堆栈为空。同样,注意这个函数使用了现存的is_empty和pop函数,而不是重复那些用于实际操作的代码。

create_stack函数是一个空函数。由于链式堆栈不会填满,所以is_full函数返回假。


最后我提出一个问题,放这里等待我解决,定义

//指向堆栈第一个节点的指针
static StackNode *stack;

这个指针的时候,不应该给它赋值为NULL吗?

然后配合push函数:

//push
void push( STACK_TYPE value )
{
    StackNode *new_node; //因为需要压入一个数值,所以要建立一个新节点
    
    new_node = malloc( sizeof( StackNode ) ); //为新节点分配内存
    assert( new_node != NULL ); //内存分配成功继续,否则退出
    new_node->value = value;
    new_node->next = stack;//new_node的指针指向前一个堆栈节点
    stack = new_node; //stack指针指向新节点,stack始终指向栈顶节点
}

创建第一个堆栈节点并指向该节点,第一个节点的指针字段值为NULL。

或者是我想错了,第一次学。留在这里!等待查阅!

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82730883

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。