链式栈基础

news/2024/4/17 8:36:25

一.链式栈的栈顶在哪里?

二.链栈的结构:

typedef struct LSNode

{

        int data;

        struct LSNode* next;

}LSNode ,*PLStack;

//链栈的节点.由于栈顶在第一个数据节点,所以不需要top指针

三.链式栈的实现:

//初始化
void  InitStack(PLStack ps)
{
    assert(ps != NULL);
    if (ps == NULL)
        return;
    ps->next = NULL;
}
//往栈中入数据(入栈操作)
bool  Push(PLStack ps, int val)
{
    assert(ps != NULL);
    if (ps == NULL)
        return false;

    LSNode* p = (LSNode*)malloc(sizeof(LSNode));
    assert(p != NULL);

    p->data = val;
    p->next = ps->next;
    ps->next = p;

    return true;
}
//获取栈顶元素的值,但是不删除
bool  GetTop(PLStack ps, int* rtval )
{
    assert(ps != NULL);
    if (ps == NULL)
        return false;

    if (IsEmpty(ps))
        return   false;

        *rtval=ps->next->data;
        return true;
}
//获取栈顶元素的值,但是删除
bool   Pop(PLStack ps, int* rtval)
{
    assert(ps != NULL);
    if (ps == NULL)
        return false;

    if (IsEmpty(ps))
        return   false;

    LSNode* p = ps->next;
    *rtval = p->data;

    ps->next = p->next;
    free(p);
    return true;
}
//判空
bool IsEmpty(PLStack ps)
{
    return ps->next == NULL;
}
//获取栈中有效元素的个数
int  GetLength(PLStack ps)
{
    assert(ps != NULL);
    if (ps == NULL)
        return -1;
    int count = 0;
    for (LSNode* p = ps->next; p != NULL; p = p->next)
    {
        count++;
    }
    return count;
}
//清空所有的数据
void Clear(PLStack ps)
{
    Destroy(ps);
}
//销毁
void Destroy(PLStack ps)
{
    //总是删除第一个数据节点
    LSNode* p;
    while (ps->next != NULL)
    {
        p = ps->next;
        ps->next = p->next;
        free(p);
    }
}

四.链式栈的总结:

链栈栈顶:栈顶在表头(即第一个数据节点)(时间复杂度是O(1))(采用的是链表的头插法)


https://www.xjx100.cn/news/3118893.html

相关文章

爬虫代理技术与构建本地代理池的实践

爬虫中代理的使用: 什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理? 隐藏真实IP地址:当进行爬取时,爬虫程序会发送大量的请求到目标网站。如果每个请求都使用相同的IP地址&#xff…

【Ratis】Grpc.proto文件里定义的一些RPC

一、 总览 Raft的提供了三种类型的RPC。分别如下: RaftClientProtocolService:client与server之间的交互RPC,分为ordered和unordered,一种是有序的异步请求流、一种是无序的异步请求流。RaftServerProtocolService:r…

vuepress-----7、发布在GitHub

# 7、发布在GitHub 在你的项目中,创建一个如下的 deploy.sh 文件(请自行判断去掉高亮行的注释): #!/usr/bin/env sh# 确保脚本抛出遇到的错误 set -e# 生成静态文件 npm run docs:build# 进入生成的文件夹 cd docs/.vuepress/dist# 如果是发…

Linux下Docker 离线安装详细步骤,亲测成功

1.离线原因:公司新创不能使用开元linux,使用了一个变种centOS,致使yum被禁 2.步骤: 2.1 下载docker tar包,下载地址:Index of linux/https://download.docker.com/linux/ 2.2 新建自己的软件目录&am…

Stability AI 新发布SDXL Turbo:一款实时文本到图像生成模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

提升SQL语句性能

1 内连接说明 当涉及到多个表的连接查询时,通常使用join关键字。 最常用的连接方式是左连接和内连接。 left join:找到两个表的交集,并包含左表中剩余的数据。 inner join:找到两个表的交集数据。 以下是使用inner join的示例…

《异常检测——从经典算法到深度学习》24 用于单变量时间序列异常检测的端到端基准套件

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

37.从0到上线三天搭建个人网站(第一天)

点赞收藏加关注,你也能住大别墅! 挑战三天搭建个人网站 从0到上线 一、项目的主要功能 1.作为自己在网上的一个工作室。 2.发帖 3.展示个人项目连接 4.介绍自己(没准儿还能接点活儿) 二、UI风格参考 三、技术选型 1.前端&a…