链栈的实现--C 语言版,详细讲解+代码实现

2023-11-08

顺序栈的实现–C 语言版,详细讲解+代码实现

例如:第一章 Python 机器学习入门之pandas的使用



前言

链栈,解决了顺序栈的长度有限问题和地址必须相邻问题。


一、结构体定义

一如既往,为方便操作,将结构体定义为两部分,一部分用来存储数据,另一部分用来装填地址,头节点的data仍然存储整个链栈的长度。

//定义
typedef struct Node{
    int data;
    struct Node* next;
}Node;

二、操作步骤

1.初始化

定义好一个头节点,将其data赋值为0,并将其指针置空。

//初始化
Node* init(){
    Node* node = (Node*)malloc(sizeof(Node));
    node->data=0;
    node->next=NULL;
    return node;
}

2.判断栈是否为空

通过头指针存储的data值或者通过头指针的next地址来判断是否为空,做出一个这种函数来方便之后操作。

//判断栈是否为空
int empty(Node* node){
    if(node->data==0 || node->next==NULL){
        return 1;
    }else{
        return 0 ;
    }
}

3. 入栈操作

由于栈先进后出的特性,我们为了方便操作,将链栈的插入做成类似于单链表头插法的形式,在头插法下,新插入的数据结点将是离头节点最近的结点,当我们出栈操作的时候也直接操作首元结点即可。
步骤如下:

  1. 建立一个辅助结点prenode,将data赋给它的data变量
  2. 将prenode结点作为新的首元结点插入到头节点之后,剩下的结点一次后移
  3. 栈的长度+1
//入栈 
void push(Node * node ,int data){
    Node* curnode = (Node*)malloc(sizeof(Node));
    curnode->data=data;
    curnode->next = node->next;
    node->next= curnode;
    node->data++;
}

4. 出栈操作

由于我们入栈操作是类似于头插法一样的插入方法,所以当我们出栈的时候就并不需要太多循环遍历操作,直接对首元结点进行操作即可。

  1. 判断栈是否为空
  2. 当栈不为空的时候,将原本的首元结点地址替换为首元结点的下一个结点的地址即可
  3. 栈的长度-1
//出栈
void pop(Node* node){
    if(!empty(node)){
        Node* prenode = (Node*)malloc(sizeof(Node));
        prenode = node->next;
        node->next = prenode->next;
         free(prenode);
        node->data--;
    }
}

5.遍历操作

遍历操作的方法有很多种,这边使用的是利用栈的长度进行操作的方法,直接利用之前单链表的方法对结点进行循环也一样,甚至可能更简单,观者可任意发挥。

  1. 首先判断栈是否为空
  2. 利用辅助结点和辅助变量进行循环输出。
//遍历
void print(Node* node){
    if(empty(node)){
        return;
    }else{
        Node* prenode=(Node*)malloc(sizeof(Node));
        int i=1;
        prenode = node->next;
        while(i<=node->data){
            printf("%d\n",prenode->data);
            prenode = prenode->next;
            i++;
        }
    }
}

6.运行

int main(){
    Node* node = init();
    push(node,24);
    push(node,41);
    push(node,67);
    print(node);
    printf("======================\n");
    pop(node);
    print(node);
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链栈的实现--C 语言版,详细讲解+代码实现 的相关文章

随机推荐

  • 5.1 综合案例- 将温湿度数据发送到云端(2.2版本接口有更新)

    综合案例 将温湿度数据发送到云端 案例说明 功能实现 1 物联网平台开发 2 设备端开发 2 代码 3 测试效果 案例说明 温湿度传感器测量当前温湿度 将实时温湿度信息上传云端 从而实现云端的监管 传感器使用详见3 11 haas506 2
  • centos7安装配置hadoop-3.2.2(单机安装、伪分布式安装)

    前言 看着官网的教程还是有坑的 so总结了一下 一 环境准备 centos7 hadoop3 2 2 jdk1 8 yum install rsync y ssh 最小化安装的系统中已有ssh 不用安装 二 开始安装 1 首先安装rsync
  • 华为OD机试 - 数大雁(Python)

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雁发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • OSPF详解(HCIP)

    学习目标 1 了解OSPF基本特性 2 了解OSPF邻接关系建立流程 3 了解OSPF报文 4 了解1类到7类LSA 5 OSPF矢量图画法 6 OSPF不规则区域解决方法 7 OSPF网络类型 8 OSPF特殊区域特性 一 OSPF基本特
  • JAVA 记录内网服务通过外网服务获取文件流

    公司项目遇到 对接第三方接口时需要根据链接获取网络文件保存到我们自己的服务器 但是本服务无法访问外网 只能通过请求另一个服务去访问外网 故准备由外网服务获取网络文件并将文件流推送回内网服务进行保存 外网服务接口 RestController
  • 华为OD机试 C++【代表团坐车】

    题目 一场大会上 有好几个代表团同时到达 接待处的问题是 只有一辆车去接 而这车的座位是有限的 你的任务是帮助接待员算出 有多少种方法可以让这车的座位恰好坐满 不多也不少 限制条件 每个代表团的人数都不会超过车的总座位数 每个代表团的人数和
  • 算法:图解位运算以及鸽巢原理应用

    文章目录 实现原理 基础位运算 位图思想 找最右侧数 按位异或 算法思路 典型例题 基础位运算 只出现一次的数字 只出现一次的数字III 经典题型 判断字符是否唯一 两整数之和 只出现一次的数字II 消失的两个数字 鸽巢原理 总结 本篇总结
  • visual studio2019下配置openCV

    openCV系列文章目录 文章目录 openCV系列文章目录 前言 一 解决办法 二 使用步骤 1 引入库 2 读入数据 运行结果 注意 工程源码下载 前言 我们使用CMake编译openCV源码 后会生成lib dll库 但是我发现在我的
  • emoji表情符号有时不能正常显示的问题的解决方案

    1 emoji表情符号应用场景及遇到的问题 emoji表情符号使用的场景 前端页面将用户带有emoji表情符号的留言发送给后端保存后 前端页面从后端获取留言再次展现 但是到再次从后端获取留言展示时 emoji表情符号不能正确展示 估计是后端
  • 操作系统第一章操作系统引论作业

    操作系统第一次课程作业 1 如果计算机不配操作系统 用户编写程序与运行程序需经历怎样的过程 需要人工操作 需要编写机器语言 需要脱机输入输出 2 什么是操作系统 它有什么基本特征 列举4种操作系统的名称 操作系统是管理计算机硬件与软件资源的
  • AcDbTable

    AcDbTable pTab new AcDbTable AcGePoint3d pInsert AcGePoint3d 0 0 0 AcDbDictionary pDict NULL 格式设置 AcDbObjectId idTblStyl
  • 简述for in 和 for of 的区别

    1 推荐在循环对象属性的时候使用 for in 在遍历数组的时候的时候使用 for of 2 for in 循环出的是 key for of 循环出的是 value 3 注意 for of 是 ES6 新引入的特性 修复了 ES5 引入的
  • Python科学计算的瑞士军刀——Anaconda 安装与配置

    Introduce Python是一种强大的编程语言 其提供了很多用于科学计算的模块 常见的包括numpy scipy和matplotlib 要利用Python进行科学计算 就需要一一安装所需的模块 而这些模块可能又依赖于其它的软件包或库
  • 数据库优化、索引【面试题】

    目录 数据库调优的目标 索引覆盖是什么 最左缀原则是什么 哪些因素可能会造成Mysql性能问题 如果sql语句需要使用联表查询我们如何进行优化呢 Mysql常见优化手段 你从哪些方面去优化你的数据库 一个页面响应很慢 你按照什么顺序去排查
  • java 微信请求_微信小程序请求微信api授权登录(Java后端)

    1 小程序端调用wx login 获取到微信返回的code临时凭证 2 小程序端调用我方的后台接口 Java后端调用微信的api 需要appId appSecret js code grant type authorization code
  • 简单易用的公司网页模板,助您快速建站

    在当今数字化时代 拥有一个高质量的公司网页是每个企业成功的关键 然而 对于那些没有技术专业知识的人来说 创建一个专业的网页可能是一项艰巨的任务 但是 现在有许多简单易用的公司网页模板可用于帮助您快速建站 下面 我们将简单地介绍一下如何利用这
  • 合并链表(C++)

    合并两个排序的链表 剑指Offer 25 问题描述 输入两个递增排序的链表 合并这两个链表并使新链表中的节点仍然是递增排序的 示例 输入 1 gt 2 gt 3 1 gt 3 gt 4 输出 1 gt 1 gt 2 gt 3 gt 4 gt
  • 【毕业设计】Python_基于DFM模型AHP算法的学生消费行为分析

    资源下载 https download csdn net download wouderw 87402799 1 分析学生消费行为的目的 1 分析学生的消费行为和食堂的运营状况 为食堂运营提供建议 2 根据学生的整体校园消费行为 选择合适的
  • DOTA: A Large-scale Dataset for Object Detection in Aerial Images 翻译

    DOTA 用于航空图像中目标检测的大规模数据集 原文 https arxiv org pdf 1711 10398 pdf 官网 https captain whu github io DOTA dataset https captain
  • 链栈的实现--C 语言版,详细讲解+代码实现

    顺序栈的实现 C 语言版 详细讲解 代码实现 例如 第一章 Python 机器学习入门之pandas的使用 文章目录 顺序栈的实现 C 语言版 详细讲解 代码实现 前言 一 结构体定义 二 操作步骤 1 初始化 2 判断栈是否为空 3 入栈