链栈的基本使用

//链栈的基本知识和使用
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
#define StackElemType int//自定义链栈的数据类型,方便修改

//链栈的定义
typedef struct node{
    StackElemType data;
    struct node *next;
}LinkStacknode;//自定义链栈结点

typedef LinkStacknode *LinkStack;//这里面我的理解是上面是自定义数据类型的一种链栈的结点。LinkStack S即为一个指针变量
// 而用这种数据类型再定义另一种数据类型的指针,这种指针用来定义的一个变量就是一个链栈。是不是可以理解为地址的地址就是这个元素本身

//链栈的初始化
void InitLinkStack(LinkStack S){
    S->next = NULL;
}//这个很简单

//链栈的进栈操作,和出栈的操作一样,变量需要做出改变并传回改变后的变量,所以需要使用指针变量
int Push(LinkStack S, StackElemType x){//将元素x压入链栈S中
    LinkStacknode *p;//定义一个结点,因为需要压入栈
    p = (struct node *)malloc(sizeof (struct node));//为这个结点申请空间
    if(p == NULL){//这里做的是倘若分配内存空间失败,但是一般不会出现在这种情况,个人认为不写的话因该不会出现错误
        return false;
    } else{
        p->data = x;//为结点赋值
        //这里面人有两种写法,我思考了很久,依旧是我之前指出来的点,我们讨论的依旧是有头结点的链栈,所以下面这句话才得以实现
        //因为头结点永远在栈顶
        //永远为空
        p->next = S->next;
        S->next = p;//替换S
        return true;
    }
}

//链栈的出栈操作
int Pop(LinkStack S, StackElemType *x){
    LinkStacknode *p;
    if(S->next == NULL){
        return false;//空栈无法出栈
    } else{
        p->next = S->next;
        *x = S->next->data;//元素带出
        free(p);//出栈操作
        return true;
    }
}

//主函数可以用来测试功能
int main() {
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值