当前位置:   article > 正文

【C语言实现链栈】看完这篇文章,你又进步了_c语言创建一个空的链栈,实现栈的入栈、出栈、返回栈顶元素基本算法。

c语言创建一个空的链栈,实现栈的入栈、出栈、返回栈顶元素基本算法。

目录

一、基本概念

1.定义

2.优点

二、链栈的表示

 三、链栈的基本操作

 1.创建空链栈

 2.链栈的判空操作

 3.链栈的入栈操作

 4.链栈的出栈操作

 5.取链栈的栈顶元素


一、基本概念

1.定义

栈可以采用链接的方式表示,把栈组织成一个单链表,这种数据结构称为链接栈。即采用链式存储的栈称链栈。

2.优点

便于多个栈共享存储空间和提高效率,且不存在栈上溢的情况 。

二、链栈的表示

类似于单链表,可以把栈直接定义为指向栈结点的指针,这个指针同时也是栈顶指针。

为了强调栈顶是栈的一个属性,对栈进行了封装,引入了LinkStack结构。

  1. typedef int ElemType;
  2. struct Node { //单链表节点定义
  3. ElemType data; //数据域
  4. struct Node* next; //指针域
  5. };
  6. struct LinkStack { //链栈类型定义
  7. struct Node* top;
  8. };
  9. typedef struct LinkStack* PLinkStack; //链栈类型的指针类型

 三、链栈的基本操作

1.创建空链栈

类似于单链表的创建。动态申请一个栈顶结点内存,并使栈顶指针指向空,表示创建的栈为空栈。

  1. PLinkStack CreateLinkStack(void)
  2. {
  3. PLinkStack plstack = (PLinkStack)malloc(sizeof(struct LinkStack)); //申请一个节点空间
  4. if (plstack == NULL) //节点申请失败,返回空指针
  5. {
  6. return NULL;
  7. }
  8. plstack->top = NULL; //申请成功,栈顶指针为空
  9. return plstack; //返回空链栈
  10. }

 2.链栈的判空操作

栈顶指针指向空,表示栈空。

  1. bool EmptyLinkStack(PLinkStack plstack)
  2. {
  3. return (plstack->top == NULL); //判断栈顶指针是否为空
  4. }

 3.链栈的入栈操作

不用担心链栈已满,上溢的问题,因为链表不存在这个问题。

在栈顶插入元素,即在单链表的表头插入元素。动态申请一个结点,存入数据后,插入队头(即单链表的表头),再把栈顶指针指向新插入的结点。

  1. bool Push(PLinkStack plstack, ElemType e)
  2. {
  3. struct Node* p = (struct Node*)malloc(sizeof(struct Node));
  4. if (p == NULL) //申请新节点空间失败
  5. {
  6. return false;
  7. }
  8. //不用判断栈是否已满
  9. p->data = e;
  10. p->next = plstack->top; //新节点连接到链栈栈顶指针之后,
  11. plstack->top = p; //链栈栈顶指针指向新增节点
  12. return true;
  13. }

 4.链栈的出栈操作

与入栈操作不同之处在于,链栈的出栈操作需要判断是否栈空(即top == NULL)

栈不空时,先用e存储栈顶元素,再让栈顶指针指向栈中的第二个结点,最后释放第一个结点的内存空间。

  1. bool Pop(PLinkStack plstack, ElemType* e)
  2. {
  3. struct Node* p;
  4. if (plstack->top == NULL) //链栈为空,报错
  5. {
  6. return false;
  7. }
  8. *e = plstack->top->data; //e记录出栈的元素
  9. p = plstack->top; //p指向第一个节点
  10. plstack->top = p->next; //栈顶指针指向第二个接点
  11. free(p); //释放出栈节点的内存空间
  12. return true;
  13. }

 5.取链栈的栈顶元素

与链栈的出栈操作类似,不同在于不用修改栈顶指针

  1. bool GetTopElem(PLinkStack plstack, ElemType* e)
  2. {
  3. if (plstack->top == NULL) //链栈为空,报错
  4. {
  5. return false;
  6. }
  7. *e = plstack->top->data; //e记录栈顶的元素
  8. return true;
  9. }

 The life of a man is the process of trying.

The more one tries, the better his life will be.

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

闽ICP备14008679号