链式栈的使用

一:链式栈

1)逻辑结构:线性结构

2)存储结构:链式存储

3)操作:入栈、出栈

二:头文件定义

#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;
//1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop);
//2.入栈   data是入栈的数据
/*参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
那么修改main函数中的top,我们采用地址传递*/
int PushLinkStack(linkstack_t **ptop, datatype data);
//3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top);
//4.出栈
datatype PopLinkStack(linkstack_t **ptop);
//5.清空栈
void ClearLinkStack(linkstack_t **ptop);//用二级指针,是因为清空后需要将main函数中的top变为NULL
//6.求栈的长度
int LengthLinkStack(linkstack_t *top);//用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top);
#endif

三:代码实现

#include"linkstack.h"

//1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop)
{
    *ptop=NULL;
}
//2.入栈   data是入栈的数据
/*参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
那么修改main函数中的top,我们采用地址传递*/
int PushLinkStack(linkstack_t **ptop, datatype data)
{
    //
    linkstack_t *pnew=(linkstack_t *)malloc(sizeof(linkstack_t));
        if(pnew==NULL)
        {
            perror("CreateEpLinkStack err") ;
            return -1;
        }
        //初始化
    pnew->data=data;
    pnew->next=NULL;
    //将新节点插入
    pnew->next=*ptop;
    //移动栈针,栈针top永远指向无头单向链表的第一个节点
    *ptop=pnew;
    return 0;
}

//3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top)
{
    return top==NULL;
}
//4.出栈
datatype PopLinkStack(linkstack_t **ptop)
{
    //容错判断
    if(IsEpLinkStack(*ptop))
    {
        perror("栈空");
        return -1;
    }
    //定义pdel指向被删除节点
    linkstack_t *pdel=*ptop;
    //定义一个变量保存出站数据
    int temp=pdel->data;
    //int temp=(*ptop)->data;
    //移动栈针
    *ptop=pdel->next;
    free(pdel);
    pdel=NULL;
    //返回值
    return temp;
}
//5.清空栈
void ClearLinkStack(linkstack_t **ptop)//用二级指针,是因为清空后需要将main函数中的top变为NULL
{
    while(*ptop!=NULL)
    {
        PopLinkStack(ptop);
    }
}

//6.求栈的长度
int LengthLinkStack(linkstack_t *top)//用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
{
    int sum=0;
    while(top!=NULL)
    {
        top=top->next;
        sum++;
    }
    return sum;
}
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top)
{
    if(!IsEpLinkStack(top))
    return top->data;
    return -1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值