链式栈讲解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

1.只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。

2. 栈特点:

先进后出“FILO”    first in last out


一、链式栈是什么?

  • 链式栈是基于单链表的存储表示实现的栈。
  • 链式栈的栈顶在链表的表头,因此,新结点的插入和栈顶结点的删除都在链表的表头(即栈顶)进行。

二、使用步骤

1.建立一个空的栈并入栈

代码如下(示例):

void CreateEpLinkStack(linkstack_t **ptop)
{
    *ptop = NULL;
}
int PushLinkStack(linkstack_t **ptop, datatype data)
{
    linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));
    if (NULL == pnew)
    {
        printf("PushLinkStack malloc error\n");
        return -1;
    }
    //新节点初始化
    pnew->data = data;
    pnew->next = NULL;
    //新节点放到栈顶位置
    pnew->next = *ptop;
    *ptop = pnew; //top要始终指向栈顶
    return 0;
}

2.判断栈是否为空

代码如下(示例):

int IsEpLinkStack(linkstack_t *top)
{
    return top == NULL;
}

3.出栈

datatype PopLinkStack(linkstack_t **ptop)
{
    if (IsEpLinkStack(*ptop))
    {
        printf("PopLinkStack error\n");
        return -1;
    }
    datatype temp;
    linkstack_t *pdel = NULL; //定义一个指针目的是指向栈顶
    pdel = *ptop;             //指向栈顶
    *ptop = pdel->next;       //因为top始终指向栈顶,所以*ptop要后移一个单位。实现持续指向栈顶
    temp = pdel->data;        //用temp来标记要出栈的数据
    free(pdel);
    pdel = NULL;
    return temp;
}

 4.清空栈

void ClearLinkStack(linkstack_t **ptop)
{
    while (! IsEpLinkStack(*ptop))
    {
        PopLinkStack(ptop);//引用出栈函数挨个释放
    }
}

 5.求栈的长度

int LengthLinkStack(linkstack_t *top)//因为只是求长度所以用一维指针即可
{
    int len=0;
    while(top !=NULL)
    {
        len ++;
        top=top->next;//从栈顶到栈底走一遍
    }
    return len;//返回值len即为该长度
}

6.获取栈顶数据

datatype GetTopLinkStack(linkstack_t *top)
{
   if(!IsEpLinkStack(top))
   {
       return top->data;
   }
   return -1;
}

7.主函数

#include"linkstack.h"
int main()
{
    linkstack_t *top;
    CreateEpLinkStack(&top);
    int i;
    for(i=0;i<5;i++)
    {
       PushLinkStack(&top,i);
    }
#if 0
    for(i=0;i<5;i++)
    {
        printf("%d\n",PopLinkStack(&top));
    }
#endif
printf("len: %d\n",LengthLinkStack(top));
printf("top_data:%d\n",GetTopLinkStack(top));
#if 0
    ClearLinkStack(&top);
#endif
    return 0;
}

.h文件:

#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct linkstack
{
    datatype data;
    struct linkstack *next;
}linkstack_t;
void CreateEpLinkStack(linkstack_t **ptop);
int PushLinkStack(linkstack_t **ptop,datatype data);
int IsEpLinkStack(linkstack_t *top);
datatype PopLinkStack(linkstack_t **ptop);
void ClearLinkStack(linkstack_t **ptop);
int LengthLinkStack(linkstack_t *top);
datatype GetTopLinkStack(linkstack_t *top);
#endif

总结

顺序栈和链式栈的区别是什么?

(1)存储结构不同,顺序栈相当于数组,连续的,链式栈 链表非连续的

(2)顺序栈的长度受限制,而链栈不会

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值