数据结构系列学习(七) - 链栈(Chain_Stack)

news2024/12/22 22:39:18

目录

引言:

学习:

代码实现:

头文件(Chain_Stack.h):

设置链栈中的元素范型:

链栈的结构体设计:

所有功能函数的声明:

源文件(Chain_Stack.cpp)对函数功能的具体实现:

初始化函数(Init_Stack):

清空函数(Clear);

销毁函数(Destroy):

打印函数(Show):

查找函数(Search):

入栈函数(Push):

出栈函数(Pop):

返回栈顶元素函数(Top):

判空函数(IsEmpty):

获取有效数据个数函数(Get_Length):

测试:

测试初始化函数、打印函数:

测试清空函数: 

测试销毁函数:

​测试查找函数:

​测试入栈函数:

测试出栈函数:

测试返回栈顶元素函数:


引言:

数据结构学习目录:

数据结构系列学习(一) - An Introduction to Data Structure

数据结构系列学习(二) - 顺序表(Contiguous_List) 

数据结构系列学习(三) - 单链表(Linked_List) 

数据结构系列学习(四) - 单向循环链表(Circular Linked List) 

数据结构系列学习(五) - 双向链表(Double_Linked_List) 

数据结构系列学习(六) - 顺序栈(Stack) 

在上篇文章中我们了解学习了顺序栈,并使用代码对它进行了实现。这篇文章我们将对栈的另外一种表达形式——链栈(Chain_Stack)进行了解学习并使用代码对它进行实现。

学习:

链栈,即栈的链式存储结构,链栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。

这里我们需要思考,我们应该如何用单链表来实现栈这一种存储方式呢?如图为不带头节点的单链表:

 

在之前我们讲过,栈(Stack)这种东西,就是限定仅在表尾进行插入或删除操作的线性表。

所以我们依照栈的特性,我们就将这个吞吐的口设定在单链表的头节点和第一个有效节点之间,其实也就是我们之前实现过的单链表中的头插和头删功能。

这玩意儿也没啥难的,说白了,就是阉割版的单链表。

代码实现:

链栈中要实现的功能函数:

初始化函数(Init_Stack);

清空函数(Clear);

销毁函数(Destroy);

打印函数(Show);

查找函数(Search);

入栈函数(Push);

出栈函数(Pop);

返回栈顶元素函数(Top);

判空函数(IsEmpty);

获取有效数据个数函数(Get_Length);

头文件(Chain_Stack.h):

设置链栈中的元素范型:

typedef int Elem_type;

链栈的结构体设计:

typedef struct CStack
{
    Elem_type data;
    struct CStack* next;
}Stack,*PStack;

所有功能函数的声明:

void Init_Stack(PStack cstack);
void Clear(PStack cstack);
void Destroy(PStack cstack);
void Show(PStack cstack);
PStack Search(PStack cstack,Elem_type val);
bool Push(PStack cstack,Elem_type val);
bool Pop(PStack cstack);
Elem_type top(PStack cstack);
bool IsEmpty(PStack cstack);
int Get_Length(PStack cstack);

源文件(Chain_Stack.cpp)对函数功能的具体实现:

初始化函数(Init_Stack):

void Init_Stack(PStack cstack)
{
    assert(cstack != nullptr);
    cstack->next = nullptr;
}

清空函数(Clear);

void Clear(PStack cstack)
{
    Destroy(cstack);
}

销毁函数(Destroy):

void Destroy(PStack cstack)
{
    assert(cstack != nullptr);
    while (!IsEmpty(cstack)){
        Pop(cstack);
    }
}

打印函数(Show):

void Show(PStack cstack)
{
    assert(cstack != nullptr);
    PStack p = cstack->next;
    for(;p != nullptr;p = p->next){
        printf("%3d", p->data);
    }
}

查找函数(Search):

PStack Search(PStack cstack,Elem_type val)
{
    assert(cstack != nullptr);
    PStack p = cstack->next;
    assert(p != nullptr);
    for(;p != nullptr;p = p->next){
        if(val == p->data){
            return p;
        }
    }
    return nullptr;
}

入栈函数(Push):

bool Push(PStack cstack,Elem_type val)
{
    assert(cstack != nullptr);
    PStack pnewnode = (PStack)malloc(1 * sizeof(Stack));
    assert(pnewnode != nullptr);
    pnewnode->data = val;
    pnewnode->next = cstack->next;
    cstack->next = pnewnode;
    return true;
}

出栈函数(Pop):

bool Pop(PStack cstack)
{
    assert(cstack != nullptr);
    if(IsEmpty(cstack)){
        return false;
    }
    PStack p = cstack->next;
    assert(p != nullptr);
    cstack->next = p->next;
    return true;
}

返回栈顶元素函数(Top):

Elem_type top(PStack cstack)
{
    assert(cstack != nullptr);
    PStack p = cstack->next;
    for(;p != nullptr;p = p->next);
    printf("%3d",p->data);
}

判空函数(IsEmpty):

bool IsEmpty(PStack cstack)
{
    assert(cstack != nullptr);
    return cstack->next == nullptr;
}

获取有效数据个数函数(Get_Length):

int Get_Length(PStack cstack)
{
    assert(cstack != nullptr);
    int count = 0;
    PStack p = cstack->next;
    for(;p != nullptr;p = p->next){
        count++;
    }
    return count;
}

测试:

测试初始化函数、打印函数:

#include "Chain_Stack.h"
#include<cstdio>
int main()
{
    Stack chain;
    Init_Stack(&chain);
    for(int i = 0;i < 10;i++){
        Push(&chain,i + 1);
    }
    printf("原始数据为:\n");
    Show(&chain);
    return 0;
/*
    此处添加其他测试代码...
*/
}

运行结果:

测试清空函数: 

    Clear(&chain);
    printf("\n经过清空操作之后的数据为:\n");
    Show(&chain);

运行结果: 

测试销毁函数:

    Destroy(&chain);
    printf("\n经过销毁操作之后的数据为:\n");
    Show(&chain);

运行结果: 

测试查找函数:

    PStack p = Search(&chain,2);
    printf("\n元素2在链栈中的地址为:%p\n",p);

运行结果:

测试入栈函数:

    Push(&chain,11);
    printf("\n经过入栈操作之后的数据为:\n");
    Show(&chain);

运行结果:

测试出栈函数:

    Pop(&chain);
    printf("\n经过一个出栈后的数据为:\n");
    Show(&chain);

 运行结果:

 测试返回栈顶元素函数:

    printf("\n栈顶元素为:%3d",top(&chain));

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试场景设计之 阶梯性能场景(负载测试场景)

「负载测试&#xff1a;」 逐步增加并发用户数。看服务器的最大拐点区间在哪里。再缩小拐点区间&#xff0c;找出最大并发用户数。 使用方式&#xff1a; 安装 jpgc插件 添加线程组 每次递增10个并发 This group will start&#xff1a;给定当前负载的并发用户数First, wait …

机器学习-集成算法

文章目录集成算法1. 定义2. 具体模型2.1. Bagging2.2. Boosting2.3. Stacking3. 随机森林3.1. 树模型结构3.2. 随机森林的优点3.3. 分类与回归问题3.4. 树模型个数问题3.5. 参数问题(特征重要性)3.6. 可视化展示问题4. 集成基本思想4.1. 硬投票策略步骤4.2. 软投票策略步骤5. B…

【SpringMVC】基础、环境搭建、注解搭建、 and so on……

文章目录SpringMVC【原理】&#xff1a;一、why?&#xff1a;二、环境搭建&#xff08;配置方式&#xff09;&#xff1a;▶1.导入jar包▶2.创建简单测试----创建Controller类继承AbstractController▶3.如何读取Controller文件&#xff0c;创建SpringMVC.xml配置文件&#xf…

使用SPACEDESK时iPad显示Connected-Display OFF解决方法

使用SPACEDESK时iPad显示Connected-Display OFF1. SPACEDESK 概述2. 使用SPACEDESK时iPad显示Connected-Display OFF解决方法结束语1. SPACEDESK 概述 SPACEDESK 是一款网络显示多显示器软件&#xff0c;适用于电脑桌面复制&#xff08;镜像或克隆&#xff09;&#xff0c;能将…

[附源码]java毕业设计代驾服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

初识C语言

初识C语言什么是C语言&#xff1a;环境配置&#xff08;VS2019介绍&#xff09;&#xff1a;你的第一个C语言程序常量与变量变量的分类局部变量与全局变量的对比变量的使用&#xff1a;变量的作用域和生命周期&#xff08;重要&#xff09;生命周期常量字符串转义字符注释转义字…

章节1 计算机体系结构

1.2.1-计算机硬件组成-CPU 计算机组成 台式机硬件-内部 台式机硬件-外部结构 CPU Center Processing Unit&#xff08;中央处理器/处理器&#xff09; 常见的电脑处理器&#xff1a; Inetl奔腾8086、酷睿i5 i7 i9&#xff1b;AMD 锐龙 常见的手机处理器&#xff1a; 高通…

SOT-23和SOT-223三极管及MOS管封装区别以及示意图

SOT23封装 三极管 三极管为SOT23封装时&#xff0c;无论是NPN还是PNP。 引脚分布1脚为基极(B)&#xff0c;2脚为发射极(E)&#xff0c;3脚为集电极©。 NPN PNP MOS管 MOS管为SOT23封装时&#xff0c;无论是N-MOS还是P-MOS。 引脚分布1脚为栅极(G)&#xff0c;2脚为源极(S…

Vue3树形控件实现跳转页面

今天想分享的是Vue3中利用element-plus中的树形控件实现跳转页面&#xff0c;做成类似标签页tabs一样的效果。 1、什么是树形控件 树形控件即可以展现层级结构&#xff0c;可以清晰的看到什么需求在哪个项目下&#xff0c;如下图所示 树形控件直通车 2、分析树形控件的基本…

cspj2022 T4 上升点列(point)题解(floyd)

样例一&#xff1a; 8 2 3 1 3 2 3 3 3 6 1 2 2 2 5 5 5 3 样例一输出&#xff1a; 8 样例二&#xff1a; 4 100 10 10 15 25 20 20 30 30 样例二输出&#xff1a; 103 一、题目解析&#xff1a; 平面上有若干个点&#xff0c;若点[i]可以沿着x或y增加方向移动达到点[j…

树的存储结构

双亲存储结构 ● 做法 • 一种顺序存储结构 , 用一组连续空间存储树的所有节点, • 同时在每个节点中附设一个伪指针指示其双亲节点的位置 • 按顺序依次存储 , 逐层逐个节点存储在数组里面 ● 定义存储结构 typedef struct {//定义数据区ElemType data;//指向其双亲在数组中的…

对象的比较(上)PriorityQueue中的底层源码解析

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 问题引入 offer() 扩容 构造方法 grow() siftUp() siftUpComparable&#xff08;&#xff09; 问题引入 问题是这样的&#xff0c…

LeetCode ——160. 相交链表,142. 环形链表 II

✅<1>主页&#xff1a;C语言的前男友 &#x1f4c3;<2>知识讲解&#xff1a;LeetCode经典链表笔试题目 &#x1f525;<3>创作者&#xff1a;C语言的前男友 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f3e1;<5>系统环境&#xff1a;…

机器学习笔记 十八:基于3种方法的随机森林模型分析房屋参数重要性

这里写自定义目录标题1. 探索性数据分析1.1 数据集分割&#xff08;训练集、测试集&#xff09;1.2 模型拟合2. 特征重要性比较2.1 Gini Importance2.2 Permutation Importance2.3 Boruta3. 特征比较3.1 Gini Importance3.2 Permutation Importance3.3 Boruta4. 模型比较将机器…

算法设计与分析复习(一)

判断题&#xff1a; 如果一个NP完全问题能在多项式时间内得到解决&#xff0c;那么NP中的每一个问题都能在多项式时间内求解。&#xff08;T&#xff09;可以用如下方法来证明某结论X成立&#xff1a;先假设X不成立&#xff0c;在此假设基础上推出X成立&#xff0c;则可以证明…

8、Bean的循环依赖问题

8.2 singleton下的set注入产生的循环依赖(解决) A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Husband Data public class …

覆盖变量漏洞

变量覆盖&#xff1a; \> $a 1; $b 2; $a 3; echo $a; > 输出3 .代码从上而下执行&#xff0c;$a被多次定义 常见变量覆盖导致漏洞的函数 \> 经常导致变量覆盖漏洞场景有&#xff1a; $$使用不当 EXTRACT()函数使用不当 PARSE_STR()函数使用不当IMPORT_REQUEST_…

c语言指针(深入了解指针)

前沿&#xff1a; 有人曾说过不会指针等于没有学习c语言&#xff0c;而我也是非常认同这个观点的&#xff0c;要想学习好c语言&#xff0c;指针是比不可缺少的&#xff0c;如果指针学不会c语言也就没办法学好&#xff0c;而向如此越重要的东西越比较难学&#xff0c;但难学并不…

Qt基础之四:Qt信号与槽机制原理及优缺点

信号和插槽用于对象之间的通信。信号和槽机制是Qt的核心特性&#xff0c;可能也是与其他框架提供的特性最大不同的部分。Qt的元对象系统使信号和槽成为可能。 一.简介 在GUI编程中&#xff0c;当我们改变一个控件&#xff0c;通常希望其他控件被通知到。更一般的&#xff0c;…

【优化覆盖】基于matlab果蝇算法求解无线传感器覆盖优化问题【含Matlab源码 2215期】

一、⛄果蝇算法 果蝇优化算法(Fruit Fly Optimization Algorithm, FOA) 是台湾学者潘文超经过研究发现, 并于2011年提出的一种新型智能优化算法, 它具有很好的全局优化性能, 能够解决很多的优化求解问题.果蝇有着优于其它生物的感官知觉, 特别是视觉与嗅觉, 依靠灵敏的嗅觉, 果…