`

重学数据结构004——栈的基本操作及实现(数组实现)

阅读更多

 

 上文提到过栈以及栈的基本操作。上文中是基于链表做的实现。但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的。

    另外一种实现方式是基于数组的实现。这种实现方式需要预先制定一个栈的大小,此外还需要一个Top来记录栈顶元素下一个位置的数组索引值。如下图所示:

    有的教材将Top指向栈顶元素,也就是上图中X所在的数组单元。我们这里不这么认为。

    这种情况下栈的数据结构定义如下:

 

typedef struct StackRecord *Stack; 
struct StackRecord 
{ 
    int Capacity; 
    int Top; 
    int *Array; 
}; 

     主要操作如下:

 

//判断栈是否为空 
int IsEmpty(Stack S); 
//判断栈是否已满 
int IsFull(Stack S); 
//创建栈 
Stack CreateStack(int MaxElements); 
//回收栈 
void DisposeStack(Stack S); 
//清空栈 
void MakeEmpty(Stack S); 
//进栈操作 
void Push(int X, Stack S); 
//返回栈顶元素 
int Top(Stack S); 
//出栈操作 
void Pop(Stack S); 
//出栈并且返回栈定元素 
int PopAndTop(Stack S); 

  一个完整的例子代码如下:

 

#include <stdio.h> 
#include <stdlib.h> 
#define MIN_STACK_SIZE 5 
 
typedef struct StackRecord *Stack; 
 
struct StackRecord 
{ 
    int Capacity; 
    int Top; 
    int *Array; 
}; 
 
//判断栈是否为空 
int IsEmpty(Stack S); 
//判断栈是否已满 
int IsFull(Stack S); 
//创建栈 
Stack CreateStack(int MaxElements); 
//回收栈 
void DisposeStack(Stack S); 
//清空栈 
void MakeEmpty(Stack S); 
//进栈操作 
void Push(int X, Stack S); 
//返回栈顶元素 
int Top(Stack S); 
//出栈操作 
void Pop(Stack S); 
//出栈并且返回栈定元素 
int PopAndTop(Stack S); 
 
int IsEmpty(Stack S) 
{ 
    return S->Top == 0; 
} 
 
int IsFull(Stack S) 
{ 
    return S->Top == S->Capacity; 
} 
 
void MakeEmpty(Stack S) 
{ 
    S->Top = 0; 
} 
 
Stack CreateStack(int MaxElements) 
{ 
    if(MaxElements < MIN_STACK_SIZE) 
    { 
        fprintf(stderr, "Can't create a Stack less than %d elements\n",MIN_STACK_SIZE); 
        exit(1); 
    } 
    else 
    { 
        Stack S = malloc(sizeof(struct StackRecord)); 
        if(S == NULL) 
        { 
            fprintf(stderr, "Out of space!"); 
            exit(1); 
        } 
        S->Array = malloc(sizeof(int)*MaxElements); 
        S->Capacity = MaxElements; 
        MakeEmpty(S); 
        return S; 
    } 
} 
 
 
void DisposeStack(Stack S) 
{ 
    if(S != NULL) 
    { 
        free(S->Array); 
        free(S); 
    } 
} 
 
void Push(int X, Stack S) 
{ 
    if(IsFull(S)) 
    { 
        fprintf(stderr,"The Stack Is Full"); 
    } 
    else 
    { 
        //元素先入栈 
        S->Array[S->Top++] = X; 
    } 
} 
 
int Top(Stack S) 
{ 
    if(!IsEmpty(S)) 
    { 
        int tmp = S->Top - 1; 
        return S->Array[tmp]; 
    } 
    else 
    { 
        fprintf(stderr,"The Stack Is Full"); 
        exit(1); 
    } 
     
} 
 
void Pop(Stack S) 
{ 
    if(!IsEmpty(S)) 
    { 
        --(S->Top); 
    } 
    else 
    { 
        fprintf(stderr,"The Stack Is Full"); 
        exit(1); 
    } 
} 
int PopAndTop(Stack S) 
{ 
    if(!IsEmpty(S)) 
    { 
        return S->Array[--S->Top]; 
    } 
    else 
    { 
        fprintf(stderr,"The Stack Is Full"); 
        exit(1); 
    } 
} 
 
int main(void)  
{ 
    Stack S = CreateStack(10); 
    int i; 
    for(i = 0; i < 10; i++) 
    { 
        Push(i,S); 
    } 
    while(!IsEmpty(S)) 
    { 
        printf("%d ",PopAndTop(S)); 
    } 
    printf("\n"); 
    return 0; 
} 
 

 

 

 

分享到:
评论

相关推荐

    【CTF-Misc领域】文件隐写、内存取证与数据修复技术应用:安全竞赛核心技能解析

    内容概要:本文详细介绍了CTF-Misc题型的应用指南,涵盖文件隐写、内存取证、数据修复等方面的核心技术。文件操作与隐写部分,讲述了文件类型识别方法(如使用file命令、010 Editor等工具查看文件特征),以及文件分离与合并的方法(如Binwalk自动化工具、dd命令手动操作)。图片隐写技术方面,包括颜色通道分析(如使用Stegsolve)、帧差异对比、Exif信息读取等。内存取证则主要围绕Volatility框架展开,介绍其基础命令(如imageinfo、pslist)和特殊场景处理(如加密文档爆破)。此外,还提供了若干工具推荐,如十六进制编辑器、自动化分离工具、OCR识别库等,并分享了实战技巧,如逆向思维应用和隐蔽信息挖掘。 适合人群:对CTF比赛感兴趣的安全研究人员、网络安全爱好者及有一定计算机基础知识的学习者。 使用场景及目标:①掌握文件隐写与修复技术,能够识别和处理各种文件类型的隐写和损坏问题;②学会使用Volatility进行内存取证,提取关键信息;③提高对隐蔽信息的敏感度,培养解决复杂问题的能力。 阅读建议:本文内容丰富,涉及多个技术领域,建议读者先熟悉基本概念和常用工具的使用,再逐步深入理解各个技术细节,在实践中不断积累经验。

    CSAPP程序人生大作业

    CSAPP程序人生大作业

    基于python+树莓派图像识别的智能循迹避障小车+源码+项目文档(毕业设计&课程设计&项目开发)

    基于python+树莓派图像识别的智能循迹避障小车+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 具体原理 道路检测 本程序所使用的道路检测算法为最基础的检测算法,可升级至深度学习算法,但是没时间搞主要是不会 对于道路检测而言,最基本的就是在图像上随机抽取图像上下部等宽区域,将图像的灰度中心计算出来,由此可以看出,当上半部图像的灰度中心与下半部图像中心的位置差超出阈值时,判定道路出现了转弯,以图像中心为坐标原点,当插值大于0时说明要右转,反之左转。可自由设置。 标识牌检测 使用opencv自带的训练网络,虽然实际训练了,但是结果较差,采用了国外训练好的图像模型,在代码中提供了。 障碍物检测 超声波检测,虽然没啥用,毕竟我们的障碍物是停止标志,图像的精度目前看来比超声波准,不过本着买了就要用的原则,用了 距离测算 采用单目视觉,首先对相机进行标定,然后利用角度计算得出前方的实际距离。但是相机在运动过程晃动较大,最后还是热熔胶枪粘的,这个功能的演示就弃了。

    深度学习中基于层结构添加自注意力机制的技术研究及其应用 特征融合

    内容概要:本文探讨了在深度学习框架下,通过在神经网络的层结构中引入自注意力机制来提升模型性能的方法。首先介绍了自注意力机制的基本概念及其在序列数据处理中的优势,然后详细阐述了如何在每一层中添加自注意力层以及如何融合不同层次的自注意力输出。最后,通过一系列实验验证了这种方法在自然语言处理和计算机视觉任务中的有效性,证明了其能够显著提高模型的表现。 适合人群:从事深度学习研究和技术开发的专业人士,尤其是对自注意力机制感兴趣的科研人员和工程师。 使用场景及目标:适用于需要改进现有神经网络模型性能的项目,特别是在处理复杂序列数据的任务中,如文本分类、图像识别等。目标是通过引入自注意力机制优化模型架构,增强模型对不同层次特征的理解能力。 阅读建议:对于希望深入了解自注意力机制并将其应用于实际项目的读者来说,本文提供了详细的理论背景和实现步骤。建议读者结合自己的应用场景,尝试复现文中提到的实验,以便更好地掌握这一技术。

    SYN.SHX

    拷贝到Auto CAD的Fonts下

    单级蜗轮蜗杆减速器的设计.rar

    单级蜗轮蜗杆减速器的设计.rar

    ZL15型轮式装载机.rar

    ZL15型轮式装载机.rar

    2024工业5G LAN网络安全技术报告.pdf

    2024工业5G LAN网络安全技术报告.pdf

    电力电子领域高电压大功率模块化多电平直流变压器仿真模型及其应用 仿真建模

    内容概要:本文详细介绍了模块化多电平直流变压器(MMC-based DC Transformer)的仿真模型,重点探讨了三相MMC面对面配置的设计与实现。该模型适用于40kV至60kV电压范围,额定输出功率为15MW,运行频率为250Hz。通过单移相控制策略,实现了输出电压电流波形的完美控制,交流侧对地相电压为准两电平方波。文章还讨论了模块化设计的优势以及如何通过Python编程实现单移相控制。 适合人群:从事电力电子领域的研究人员和技术人员,尤其是关注高电压、大功率电力传输和配电系统的专业人士。 使用场景及目标:①用于电力传输和配电系统的仿真和优化;②帮助研究人员和技术人员理解并掌握MMC的工作原理和控制策略;③提供一种高效可靠的解决方案来实现高电压、大功率电力设备的精准控制。 其他说明:本文不仅提供了理论分析,还包括具体的代码实现,有助于读者更好地理解和应用相关技术。

    电饭煲传感器外壳冲压工艺与模具设计.rar

    电饭煲传感器外壳冲压工艺与模具设计.rar

    LD.SHX

    拷贝到Auto CAD的Fonts下

    催化裂化图纸cad+pdf.rar

    催化裂化图纸cad+pdf.rar

    OK6410开发资料光盘.7z

    OK6410开发资料光盘.7z

    五相SVPWM技术在反电势正弦与非正弦五相电机矢量控制中的应用解析

    内容概要:本文深入探讨了五相SVPWM(4矢量+双空间调制)技术在反电势正弦与非正弦五相电机矢量控制中的应用。首先介绍了五相电机相较于三相电机的优势及其控制复杂性,然后详细讲解了五相Clarke变换的实现方式,将五相电流投影到α-β平面上。接着阐述了双空间调制的概念,即电压矢量被分解到两个正交子空间,分别处理基波和谐波分量,并讨论了解耦问题以及调制比超过0.5时的解决方案。随后介绍了四矢量选择策略的具体实施方法,包括扇区划分、作用时间计算等步骤。针对非正弦反电势情况,提出了谐波补偿措施,尤其是对3次谐波的特殊处理。最后给出了实验数据对比,证明该技术能够显著降低总谐波失真率,但也指出开关损耗有所增加的问题。 适合人群:从事电机控制系统设计的研究人员和技术工程师,尤其关注高精度、高性能电机控制领域的专业人士。 使用场景及目标:适用于需要精确控制五相电机的应用场合,如工业自动化设备、精密仪器等领域。主要目标是提高电机运行效率,减少谐波干扰,优化系统性能。 其他说明:文中提供了详细的数学模型和代码示例,有助于读者更好地理解和掌握相关理论与实践技巧。同时提醒读者注意调参过程中x-y子空间电流分量的变化,确保系统稳定性和可靠性。

    盖板冲孔拉深冲压模具设计.rar

    盖板冲孔拉深冲压模具设计.rar

    FRACT.SHX

    拷贝到Auto CAD的Fonts下

    运用delphi程序设计和数据库相关知识编写的学生成绩管理系统,主要包含SQL语句使用的相关内容.zip

    运用delphi程序设计和数据库相关知识编写的学生成绩管理系统,主要包含SQL语句使用的相关内容.zip

    自我提升-教材-浮游生物学

    内容:浮游生物学Plankton(英文版本) 密码:123***(你猜)

    COMSOL等离子体仿真技术在MPCVD装置与H2放电低气压环境下的应用研究 H2放电

    内容概要:本文探讨了COMSOL等离子体仿真技术在MPCVD装置与H2放电低气压环境下的应用。文中详细介绍了MPCVD(微波等离子体化学气相沉积)装置的特点及其在半导体制造、纳米材料制备等领域的广泛应用。重点讨论了H2放电低气压环境下MPCVD放电特性的仿真,包括电场、磁场、等离子体分布等物理参数的变化规律。此外,还涉及了等离子体沉积和刻蚀的仿真,旨在优化MPCVD装置的放电性能、提高沉积效率并减少刻蚀损伤。 适合人群:从事等离子体物理、材料科学、半导体制造等相关领域的科研人员和技术工程师。 使用场景及目标:①深入理解MPCVD装置的工作原理及放电特性;②优化MPCVD装置的设计和操作条件;③提高等离子体沉积和刻蚀的效果和效率。 其他说明:通过COMSOL等工具进行仿真研究,可以有效提升对等离子体行为的理解,为实际应用提供理论支持和技术指导。

Global site tag (gtag.js) - Google Analytics