【数据结构】【王道】【栈与队列】不带头结点链栈的实现及基本操作(可直接运行)

栈——链栈(不带头结点)的定义以及基本操作 超详细! #include<stdio.h> #include<stdlib.h> #include<stdbool.h> //结构体定义 typedef struct linknode { int data; struct linknode* next; }linknode, *linkstack; //初始化链栈 void initialize_stack(linkstack* s) { (*s) = NULL; } //进栈(增) void pu 阅读详情
AI摘要

本文详细介绍了链栈的实现,包括不带头结点的链栈结构体构造、初始化、判空、入栈、出栈、获取栈顶元素及输出栈中所有元素等基本操作。通过示例代码阐述了每个操作的逻辑,并提供了完整的C语言实现。在实际应用中,链栈因其操作灵活性,常被用于数据处理和算法实现。

总目录


各部分的解释已经以注释形式写于代码中。

1.说明

链栈实际上与单链表极为相似,区别主要在于判断条件以及链栈的操作只能在表头进行,即就是将单链表的操作固定在了表头。此处实现的是不带头结点的链栈,与带头结点的主要差别在于带头结点的链栈栈顶指针指向以及条件判断方面。实际上,相比于单链表带头结点对于不带头结点的优势,链栈由于都是在表头进行操作,所以带头结点链表的统一操作的优势便难以表现出来了。综上,带头结点的链栈实现其实与带头结点单链表相差不大,此处便不进行实现了。

2.基本操作

2.1 结构体构造

// 不带头结点
typedef struct LinkNode {
    int data;   // 数据域
    struct LinkNode *next; // 指针域
} LSNode, *LinkStack;   // 栈类型定义

2.2 初始化

// 初始化
void InitStack(LinkStack &S) {
    // 此为不带头结点的栈,与单链表相似,初始将栈顶指针指向NULL即可
    S = NULL;
}

2.3 判空

// 判空
bool Empty(LinkStack S) {
    // 栈为空的条件即栈顶指针指向NULL
    if(S == NULL) {
        return true;
    }
    return false;
}

2.4 入栈

// 入栈操作
// 由于栈只能从一端操作,所以每次都应该是从栈顶入栈
bool Push(LinkStack &S, int e) {
    // 申请分配空间
    LSNode *s = (LSNode*)malloc(sizeof(LSNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    s->data = e;
    // 由于每次都是从栈顶指针处插入,所以无需特殊处理
    // 令s指向S之前指向的地址
    s->next = S;
    // 使头指针指向s
    S = s;
    return true;
}

2.5 出栈

// 出栈操作
// 类似于单链表的删除操作,不过只能在栈顶进行出栈
bool Pop(LinkStack &S, int &e) {
    // 如果是空栈,则不可进行出栈操作
    if(S == NULL) {
        return false;
    }
    // 出栈结点即为栈顶指针指向的结点
    // 将出栈结点值赋给e
    e = S->data;
    // 临时结点,用于之后释放空间
    LSNode* p = S;
    // 使头指针指向下一个结点
    S = S->next;
    // 释放空间
    free(p);
    return true;
}

2.6 获取栈顶元素

// 获取栈顶元素
bool GetTop(LinkStack S, int &e) {
    // 栈为空的情况
    if(S == NULL) {
        return false;
    }
    e = S->data;
    return true;
}

2.7 输出栈中所有元素

// 输出栈中所有元素
// 由于栈只能从一端进行操作,所以想要输出所有元素,就必须要将所有元素弹出并输出
void PrintStack(LinkStack S) {
    if(Empty(S)) {
        printf("the stack is empty!");
    }
    while(!Empty(S)) {
        int x;
        Pop(S, x);
        printf("pop:%d\n", x);
    }
}

3.完整代码

#include<stdio.h>
#include<stdlib.h>

// 不带头结点
typedef struct LinkNode {
    int data;   // 数据域
    struct LinkNode *next; // 指针域
} LSNode, *LinkStack;   // 栈类型定义

// 初始化
void InitStack(LinkStack &S) {
    // 此为不带头结点的栈,与单链表相似,初始将栈顶指针指向NULL即可
    S = NULL;
}

// 判空
bool Empty(LinkStack S) {
    // 栈为空的条件即栈顶指针指向NULL
    if(S == NULL) {
        return true;
    }
    return false;
}

// 入栈操作
// 由于栈只能从一端操作,所以每次都应该是从栈顶入栈
bool Push(LinkStack &S, int e) {
    // 申请分配空间
    LSNode *s = (LSNode*)malloc(sizeof(LSNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    s->data = e;
    // 由于每次都是从栈顶指针处插入,所以无需特殊处理
    // 令s指向S之前指向的地址
    s->next = S;
    // 使头指针指向s
    S = s;
    return true;
}

// 出栈操作
// 类似于单链表的删除操作,不过只能在栈顶进行出栈
bool Pop(LinkStack &S, int &e) {
    // 如果是空栈,则不可进行出栈操作
    if(S == NULL) {
        return false;
    }
    // 出栈结点即为栈顶指针指向的结点
    // 将出栈结点值赋给e
    e = S->data;
    // 临时结点,用于之后释放空间
    LSNode* p = S;
    // 使头指针指向下一个结点
    S = S->next;
    // 释放空间
    free(p);
    return true;
}

// 获取栈顶元素
bool GetTop(LinkStack S, int &e) {
    // 栈为空的情况
    if(S == NULL) {
        return false;
    }
    e = S->data;
    return true;
}

// 输出栈中所有元素
// 由于栈只能从一端进行操作,所以想要输出所有元素,就必须要将所有元素弹出并输出
void PrintStack(LinkStack S) {
    if(Empty(S)) {
        printf("the stack is empty!");
    }
    while(!Empty(S)) {
        int x;
        Pop(S, x);
        printf("pop:%d\n", x);
    }
}

int main() {
    LinkStack S;
    InitStack(S);
    int x;
    Push(S, 3);
    GetTop(S, x);
    printf("push:%d\n", x);
    Push(S, 5);
    GetTop(S, x);
    printf("push:%d\n", x);
    Push(S, 7);
    GetTop(S, x);
    printf("push:%d\n", x);
    PrintStack(S);
}

4.运行结果

在这里插入图片描述

带头结点和不带头结点的链栈基本操作 带头结点和不带头结点的链栈基本操作不带头结点的链栈带头结点的链栈 C++数据结构 把链栈想象成单链表头结点的后插和后删操作 不带头结点的链栈 //不带头结点的链栈 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct Linknode1 { int data; struct Linknode1* next; }*LiStack1; 阅读详情

相关推荐

C语言——不带头结点的链栈

不带头结点的链栈

leonard10的博客 408

栈和队列的操作二——栈的链式存储(不带头结点)

完整代码:来吧,开始还是和之前一样,先看一下链栈的图形长什么样吧。

m0_72619231的博客 772

数据结构之栈、队列、数组--王道

1.栈 栈 (stack) 是限定仅在表尾进行插入或删除操作的线性表。 因此, 对栈来说, 表尾端有其特殊含义, 称为栈顶 (top),相应地, 表头端称为栈底 (bottom)。不含元素的空表称为空栈。 栈又称为后进先出 (Last In First Out, LIFO) 的线性表. 2.队列 队列(queue)是一种先进先出(First In First Out, FIFO)的线性表。 它只允许在表 的一端进行插入,而在另一端删除元素。 在队列中,允许插入的一端称为队尾(rear), 允许删

weixin_64144469的博客 1076

数据结构-栈-链栈基本操作(带头结点及不带头结点)

一.数据类型声明 #include<stdio.h> struct LQNode { //结点结构体 int data; //数据域 Node next; //指针域 }; typedef LQNode * Node; //结点结构体指针变量 typedef Node List; //结点结构体头指针变量 二.带有头结点的链栈基本操作 /*带头结点的链栈*/ //1.初始化 void initStack(List list) { list = new LQNode; //把结点结构体

Xulidanga的博客 7327

【2025王道数据结构】王道数据结构课后代码题汇总答案C、C++代码实现完整版大全(可直接运行)

下面内容是本人在复习王道数据结构的过程中, 对一些算法设计题目的全部实现(答案解析全部都是伪码或者函数的部分实现,不可调试运行),不一定是最优的, 但是都能保证端到端测试运行,本文会陆陆续续更新,个人水平有限,可能文章里面存在一些问题,还望各位多多指点。   加油,阿光!!!我看好你哦😋😋😋 以下摘自王道2023年数据结构考研复习指导题目 文章目录 😉第2章:线性表 ✌18页综合应用题 题号 题解链接 1 传送门 2 传送门 3 传送门 4 传送门 5 传送.

优快云 精品推荐 1万+

数据结构——五、队列(王道408)

本文介绍了队列的定义、基本操作和实现方式。队列是一种FIFO(先进先出)的线性表,包含队头、队尾和空队列等概念。基本操作包括初始化、销毁、入队、出队等。队列可通过顺序存储(数组)或链式存储实现,其中循环队列通过取模运算解决假溢出问题,并提供了判空判满的多种方法。链式队列分为带头结点和不带头结点两种。此外还介绍了双端队列及其变种(输入/输出受限)。文章详细说明了各种队列的初始化、判空、入队、出队等操作的代码实现。

2301_80201235的博客 1090

2021 王道考研 数据结构+习题讲解

2021 王道考研 数据结构 P1【2021版】0.0 课程指南 P2【2021版】1.1.0 开篇_数据结构在学什么 P3【2021版】1.1.1 数据结构的基本概念 P4【2021版】1.2.1 算法的基本概念 P5【2021版】1.2.2 算法的时间复杂度 P6【2021版】1.2.3 算法的空间复杂度 P7【2021版】2.1_线性表的定义和基本操作 P8【2021版】2.2.1_顺序表的定义 P9【2021版】2.2.2_1_顺序表的插入删除 P10【2021版】2.2.2_2_顺序表的查找 P1

weixin_47312141的博客 4万+

模拟CMOS 第2章 MOS器件物理基础

模拟CMOS 第2章 MOS器件物理基础 文章目录模拟CMOS 第2章 MOS器件物理基础2.1 基本概念2.1.1 MOSEFT开关2.1.2 MOSEFT结构2.1.3 MOS符号2.2 MOS的I/V特性2.2.1 阈值电压2.2.2 I/V特性的推导2.3 二级效应2.4 MOS器件模型2.4.1 MOS器件版图2.4.2 MOS器件电容2.4.3 MOS小信号模型2.4.4 MOS SPICE模型2.4.5 NMOS与PMOS器件的比较2.4.6 长沟道器件与短沟道器件的比较附录A 用作电容器MO

椰子奶糖的博客 5201

24王道考研408数据结构代码整合(学习用)

define MaxSize 10 //定义最大长度//用静态的“数组”存放数据元素int length;//顺序表的当前长度}SeqList;//顺序表的类型定义(静态分配方式)//基本操作——初始化一个顺序表i

Ch_ensf的博客 1万+

利用LATX技术在龙芯安同AOCS OS上部署坚果云:跨架构文件同步实战

本文详细介绍了如何在龙芯安同AOCS OS上,利用LATX指令翻译技术部署坚果云客户端,实现跨架构文件同步。通过安装LATX环境、解压x64安装包、运行安装脚本三步,成功在loongarch64架构上运行仅支持x86_64的软件,解决了国产平台办公协同的痛点,并分享了性能实测与优化建议。

weixin_29305337的博客 457

汽车电子开发必看:AUTOSAR MCAL层SPI驱动配置全解析(基于EB tresos)

本文深入解析了AUTOSAR MCAL层SPI驱动的核心配置,基于EB tresos工具详细阐述了通道、外部设备、作业与序列等关键概念。重点剖析了多设备共享总线时的资源管理与实时性调优策略,特别是SpiJobPriority参数的决定性影响,并提供了常见配置陷阱的实战排查指南,旨在帮助汽车电子工程师高效完成SPI驱动配置。

weixin_29188043的博客 293

王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记

数据结构与算法 笔记导航🚥🚥🚥 🥬 第一章 绪论 🥕 第二章 线性表 🥪 第三章 栈和队列 🍊 第四章 串-KMP(看毛片算法) 🍒 第五章 树和二叉树 🍀 第六章 图 🍚 第七章 查找(B树、散列表) 🧄 第八章 排序 (内部排序:八大排序动图演示与实现 + 外部排序) 🍔 数据结构与算法 复试精简笔记 🎨 408 全套初复试笔记汇总 传送门 🏃‍🏃‍🏃‍ 如果本篇文章对大家起到帮助的话,跪求各位帅哥美女们,求赞👍 、求收藏、求关注!

clzZ2的博客 5995

随机截距交叉滞后模型RI-CLPM:原理、Mplus实现与结果解读

纵向面板数据分析中,传统交叉滞后模型(CLPM)常被用于探索变量间的时序关系,但其估计结果可能混淆了个体间稳定差异与个体内短期波动,导致交叉滞后路径出现偏差。随机截距交叉滞后模型(RI-CLPM)通过引入随机截距因子,将个体特质层面的差异与个体内动态过程分离,从而提供更纯净的个体内效应估计。该模型在组织心理学、发展心理学、成瘾行为等研究领域迅速普及,并成为顶级期刊审稿时常见的稳健性检验要求。本文从原理出发,系统讲解RI-CLPM的模型构建、识别条件、Mplus实操代码、输出解读及常见陷阱,并结合协变量处理、

weixin_33525298的博客 275

王道数据结构-栈和队列(C++代码实现)

顺序栈(top=-1、top=0)、链栈(带头结点、不带头结点)、循环队列(顺序存储结构)的C++代码实现

lljjhh001的博客 2130

智能安防摄像头埋点实践:用户行为与设备状态的闭环监控(含AI事件)

智能安防摄像头埋点闭环体系设计及应用实践 摘要: 本文系统阐述了智能安防摄像头埋点闭环体系的设计与实践。首先分析了传统埋点的不足及闭环埋点的价值,提出由用户行为埋点、设备状态埋点和AI事件埋点构成的三维埋点体系框架。详细介绍了闭环监控的四大流程:数据采集、汇聚清洗、分析建模和智能决策。通过误报优化、个性化策略等案例展示了AI事件闭环的实际应用价值,并探讨了隐私合规、性能优化等关键挑战的解决思路。最后展望了端侧AI增强、预测型埋点等未来发展趋势。该体系实现了从数据采集到业务决策的完整闭环,有效提升了AI模型性

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 1046

拆解歌尔2718硅麦:2.75mm超小封装背后的MEMS技术解析

本文深度解析歌尔2718硅麦的2.75mm超小封装技术,探讨MEMS麦克风在微型化过程中的声学性能与结构可靠性平衡。通过ASIC芯片堆叠、纳米级应力控制等创新技术,歌尔2718在TWS耳机和智能手机中实现卓越性能,同时克服微型化带来的声学挑战。

weixin_28292761的博客 610

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1915

Oracle EBS 寄销/VMI(1)-->基础设置

名词解释:     BPA:一揽子采购协议     BPR:一揽子发放     SR:来源补充规则     ASL:合格供应商列表     VMI: 供应商管理库存     寄售(Consignment)是把货物放在客户那里,客户要用的时候才付款的库存,一般是指卖方把

陈显平的专栏-Oracle EBS 1万+

王道考研数据结构代码总结(前四章)

本文包含王道考研讲课中所涉及的数据结构中的所有代码,当PPT代码和书上代码有所区别时以咸鱼的PPT为主,个人认为PPT上的代码比王道书上的代码要便于理解,此外,本博客也许会补充一些额外的代码进来(不仅受限于王道考研),408中冷门考点频出,应该会囊括所有涉及到的代码,这也是我的DS的第二轮复习,希望与大家共勉之,由于博客体量的问题,原先打算此文也将收录诸如os中的吸烟者问题等的一系列伪代码,具体看到时候本文字数而定。如果一篇博客放不下的话会拆分成为两三篇文章发布。

佛系更新 5570

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4118

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

王道数据结构 | 第三章 栈、队列和数组

王道数据结构复习:第三章 栈队列数组

emmm_Yeah的博客 1044

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【数据结构】第三章:栈和队列

【数据结构】第三章:栈和队列 一、栈 1. 栈的定义 2. 栈的基本操作 二、顺序栈 1. 顺序栈的实现 2. 顺序栈的基本操作 3. 两种实现方式对比 3. 共享栈 三、链栈 1. 链栈的实现 2. 链栈的基本操作 四、队列 1. 队列的定义 2. 队列的基本操作 3. 双端队列 五、顺序队列 1. 顺序队列的实现 2. 顺序队列的基本操作 3. 三种实现方式对比 六、链队列 1. 链队列的实现 2. 链队列的基本操作 七、栈的应用 1. 括号匹配 2. 表达式求值 3. 递归 八、队列的应用 九、特殊矩

iFulling的博客 1687

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

王道视频-数据结构-笔记3:栈和队列

栈和队列都是操作受限的线性表。

我是一只小嵩鼠 2104

【数据结构】【王道】【栈与队列】不带头结点链式队列的实现及基本操作(可直接运行)

代码】【数据结构】【栈与队列】不带头结点链队的实现及基本操作(可直接运行) #include #include typedef struct LinkNode { // 链式队列结点 int data; // 数据域 struct LinkNode *next; // 指针域 } LinkNode; typedef struct { // 链式队列 // 如果不设置尾指针,若要插入,遍历到队尾再插入,时间复杂度O(n) .........

treesorshining的博客 906

王道数据结构笔记03—栈与队列(C语言)

本笔记来源于b站王道考研白嫖课程,仅供个人以及大家学习使用

qq_28356977的博客 2158

【王道数据结构】第三章 栈和队列

【王道数据结构】第三章 栈和队列

weixin_48434658的博客 1420
上一篇: 【数据结构】【王道】【栈与队列】顺序栈的实现及基本操作(可直接运行)
下一篇: 【数据结构】【王道】【栈与队列】循环队列的实现及基本操作(使用顺序队列)(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值