数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)

目录

前言

1.定义

2.栈的特点

3.栈的储存方式

3.1数组栈

3.2链栈

 4.栈的基本操作(C语言)

4.1初始化 

 4.2判断是否满栈

4.3判断空栈

 4.4 入栈

4.5 出栈

4.6获取栈顶元素

 4.7遍历栈

 4.8清空栈

 完整代码示例


前言

        大家好呀!今天我们开始学习新的线性表结构----栈,前面我们学习了链表以及链表的相关操作,那么栈跟链表有什么区别呢,操作如何呢?下面就一起来看看吧!

1.定义

        栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2.栈的特点

        栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

        栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈/退栈(POP)。栈也称为先进后出表。

 

3.栈的储存方式

栈的存储方式有两种:数组栈链栈,即栈的数组存储和链式存储。

 数组栈:数组栈是通过数组的形式去存放数据的,然后定义一个栈顶top指针指向当前栈顶的位置,这个位置也就是数组最后一个位置

链表栈:链表栈就是去通过链表节点的形式去储存数据,然后建立链式结构,对这个链表进行栈的相关操作,以达到栈的特点。二者的节点写法分别如下所示:

3.1数组栈
//01 数组栈
typedef struct sqstack {ElemType date[Maxsize];//数据int top;//数组栈的栈顶指针
}SqStack;
3.2链栈
//02链表栈
typedef struct linknode {ElemType date[Maxsize];//数据struct linknode* next;//指向下一个节点的指针
}* LiStack;

(本文主要讲解数组栈) 

 4.栈的基本操作(C语言)

 栈的操作方法有以下方法:

#include<stdio.h>
#include<string.h>
#define Maxsize 10//最大空间容量//数据类型
typedef struct datatype {int age;char name[10];
}ElemType;//数组栈
typedef struct sqstack {ElemType date[Maxsize];//数据int top;//数组栈的栈顶指针
}Stack;initStack(Stack *L);//初始化栈isFull(Stack *L);//判断是否满栈isEmpty(Stack *L);//判断是否空栈push(Stack *L,ElemType date);//入栈pop(Stack *L);//出栈top_date(Stack* L);//获取栈顶元素show_stack(Stack *L);//遍历栈clear_stack(Stack *L);//清空栈元素

【注:以上均是数组栈的操作方法】

4.1初始化 

让栈顶元素初始化为-1,即 L->top=-1;

//初始化
void initStack(Stack *L) {L->top = -1;
}
 4.2判断是否满栈

判断满栈的方法就是看栈顶元素位置是否达到最大容量

//判断是否满了
int isfull(Stack *L) {if (L->top == Maxsize - 1) {//此时栈已满printf("The stack is full\n");return 1;}return 0;
}
4.3判断空栈

同样的判断是否空栈,只需要看栈顶top的位置是否为初始化的时候,即L->top==-1

//判断是否为空栈
int isEmpty(Stack *L) {if (L->top == -1) {printf("The stack is empty\n");return 1;}return 0;
}
 4.4 入栈

进行入栈操作的时候,每次放入一个数据后,栈顶指针依次向上移动一位即可,如图所示:

//入栈
void push(Stack *L,ElemType date){if (isfull(L)) {  //判断栈是否满了printf("failed to push\n");return;}else {L->date[L->top].age = date.age;strcpy(L->date[L->top].name, date.name);L->top+=1;}
}
4.5 出栈

进行出栈操作时,取出栈顶元素后,栈顶指针依次向下移动一位,如下所示:

//出栈
ElemType pop(Stack *L) {ElemType pop_date = { 0 };//先判断是不是空栈if (isEmpty(L)) {return pop_date;}pop_date = L->date[L->top];L->top--;return pop_date;
}
4.6获取栈顶元素

获取栈顶元素就不进行出栈操作,直接返回栈顶元素即可。

//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {return L->date[L->top];
}
 4.7遍历栈

遍历栈,即当栈不为空的时候,从栈顶开始往下依次输出数据即可。

//遍历栈,输出数据
void show_stack(Stack *L) {if (!isEmpty(L)) {for (int i = L->top; i >= 0; i--) {printf("%d %s\n", L->date[i].age, L->date[i].name);}}
}
 4.8清空栈

清空栈,只需要让栈顶指针回归到初始化即可,L->top=-1;

//清空栈
void clear_stack(Stack *L) {L->top = -1;//直接让栈顶回归就行了//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}

 完整代码示例

#include<stdio.h>
#include<string.h>
#define Maxsize 10//设置最大空间容量typedef struct datatype {int age;char name[10];
}ElemType;
// 数组栈
typedef struct sqstack {ElemType date[Maxsize];//数据int top;//数组栈的栈顶指针
}Stack;//初始化
void initStack(Stack *L) {L->top = -1;
}//判断是否满了
int isfull(Stack *L) {if (L->top == Maxsize - 1) {//此时栈已满printf("The stack is full\,");return 1;}return 0;
}//入栈
void push(Stack *L,ElemType date){if (isfull(L)) {printf("failed to push\n");return;}else {L->top+=1;L->date[L->top].age = date.age;strcpy(L->date[L->top].name, date.name);}
}//判断是否为空栈
int isEmpty(Stack *L) {if (L->top == -1) {printf("The stack is empty\n");return 1;}return 0;
}//出栈
ElemType pop(Stack *L) {ElemType pop_date = { 0 };//先判断是不是空栈if (isEmpty(L)) {return pop_date;}pop_date = L->date[L->top];L->top--;return pop_date;
}//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {return L->date[L->top];
}//清空栈
void clear_stack(Stack *L) {L->top = -1;//直接让栈顶回归就行了//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}//遍历栈,输出数据
void show_stack(Stack *L) {if (!isEmpty(L)) {for (int i = L->top; i >= 0; i--) {printf("%d %s\n", L->date[i].age, L->date[i].name);}}
}int main() {Stack stack ;ElemType date[4] = { {15,"Jack"},{16,"Amy"} ,{15,"John"},{17,"Tom"}};initStack(&stack);for(int i=0;i<4;i++)push(&stack, date[i]);//依次入栈show_stack(&stack);	//遍历栈ElemType pop_date= pop(&stack);//出栈printf("出栈元素为:%d %s\n", pop_date.age, pop_date.name);ElemType top_date = get_topdate(&stack);//获取栈顶元素printf("栈顶元素为:%d %s\n", top_date.age, top_date.name);clear_stack(&stack);//清空栈
}
//测试结果
/*17 Tom
15 John
16 Amy
15 Jack
出栈元素为:17 Tom
栈顶元素为:15 John*/

好啦,以上就是本期的全部内容了,我们下一期再见!see you!

分享一张壁纸: 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python使用websocket实现多端数据同步,多个websocket同步消息,断开链接自动清理

我使用的是flask_sock这个模块&#xff0c;我的使用场景是&#xff1a;可以让数据多端实时同步。在游戏控制后台和游戏选手的ipad上都可以实时调整角色的技能和点数什么的&#xff0c;所以需要这样的一个功能来实现数据实时同步。 下面是最小的demo案例&#xff1a; from fla…

【小沐学NLP】关联规则分析Apriori算法(Mlxtend库,Python)

文章目录 1、简介2、Mlxtend库2.1 安装2.2 功能2.2.1 User Guide2.2.2 User Guide - data2.2.3 User Guide - frequent_patterns 2.3 入门示例 3、Apriori算法3.1 基本概念3.2 apriori3.2.1 示例 1 -- 生成频繁项集3.2.2 示例 2 -- 选择和筛选结果3.2.3 示例 3 -- 使用稀疏表示…

UE4 C++ 使用第三方库(动态库) 详解

目录 1 代码共享的方式2 使用三方库2.1 准备一个动态库&#xff08;包含.h;.lib;.dll&#xff09;2.2 创建一个UE C工程2.3 配置三方库 1 代码共享的方式 在使用三方库之前&#xff0c;先介绍一下三方库的由来&#xff0c;以及为什么需要三方库。就从程序员共享代码成果开始讲述…

IP 协议

IP协议格式 四位版本号 用来表示IP协议的版本,现有的IP协议只有两个版本,IPv4,IPv6,其他版本只在实验室中存在,没有大规模商用 四位首部长度 设定和TCP一样,IP报头是可变长的,IP报头又是带有选项(可以有,可以没有)的,这里的单位也是4个字节,也就是最大有16*464个字节的长度 …

PHP8中调换数组中的键值和元素值-PHP8知识详解

在php8中使用array_flip()函数可以调换数组中的键值和元素值。 在PHP8中使用array_flip()函数可以调换数组中的键值和元素值&#xff0c;示范代码如下&#xff1a; <?php$stu array("子涵"> 001,"欣怡"> 002,"梓涵">003,"晨曦…

华为云云耀云服务器L实例评测|centos7.9在线使用cloudShell下载rpm解压包安装mysql并开启远程访问

文章目录 ⭐前言⭐使用华为cloudShell连接远程服务器&#x1f496; 进入华为云耀服务器控制台&#x1f496; 选择cloudShell ⭐安装mysql压缩包&#x1f496; wget下载&#x1f496; tar解压&#x1f496; 安装步骤&#x1f496; 初始化数据库&#x1f496; 修改密码&#x1f4…

外卖小程序开发指南:打造完美的点餐体验

第一步&#xff1a;项目设置和初始化 首先&#xff0c;您需要选择一个适合您的开发平台&#xff0c;例如微信小程序、支付宝小程序或其他移动应用平台。接下来&#xff0c;创建一个新的小程序项目&#xff0c;并初始化所需的文件和目录。 示例代码&#xff08;微信小程序&am…

02_elasticsearch 核心概念

02_elasticsearch 核心概念 1、lucene和elasticsearch的前世今生2、elasticsearch的核心概念 1、lucene和elasticsearch的前世今生 1、lucene和elasticsearch的前世今生 lucene&#xff1a;最先进、功能最强大的搜索库。但是直接基于lucene开发&#xff0c;非常复杂&#xff…

pcl--第十节 点云曲面重建

曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如&#xff0c;在汽车、航空等工业领域中&#xff0c;复杂外形产品的设计仍需要根据手工模型&#xff0c;采用逆向工程的手段建立产品的数字化模型&#xff0c;根据测量数据建…

透视俄乌网络战之四:西方科技巨头的力量

透视俄乌网络战之一&#xff1a;数据擦除软件 透视俄乌网络战之二&#xff1a;Conti勒索软件集团&#xff08;上&#xff09; 透视俄乌网络战之三&#xff1a;Conti勒索软件集团&#xff08;下&#xff09; 西方科技巨头的力量 1. Palantir2. SpaceX3. Maxar Technologies4. Cl…

【虚幻引擎】UE5 VLC接入网络监控、视频直播、网络直播支持RTSP、RTMP

一、如何更新自己的插件匹配自己想要的UE版本 我们在网上下载的插件一般是UE4版本的插件&#xff0c;这个时候就需要我们自己去修改编译&#xff0c;接下来教大家修改插件来适配自己的引擎。 如果不想自己编译代码&#xff0c;可以直接找我拿编译好的UE5.0、UE5.1、UE5.2的插件…

【算法思想】排序

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

机器学习笔记 - 视频分析和人类活动识别技术路线简述

一、理解人类活动识别 首先了解什么是人类活动识别,简而言之,是对某人正在执行的活动/动作进行分类或预测的任务称为活动识别。 我们可能会有一个问题:这与普通的分类任务有什么不同?这里的问题是,在人类活动识别中,您实际上需要一系列数据点来预测正确执行的动作。 看看…

servlet开发-通过Tomcat部署一个简单的webapp

首先我们得下载安装Tomcat&#xff0c;推荐看Tomcat&#xff08;HTTP服务器&#xff09;下载以及认识&#xff0c; 我们将通过打印一个hello word的方式来熟悉servlet开发,通过Tomcat部署一个webapp的流程 servlet的含义 Tomcat提供了一系列的api接口&#xff0c;这些api背后…

【进阶C语言】字符串与内存库函数认识与模拟实现

本章内容大致目录&#xff1a; 1.strlen函数 2.strcpy函数 3.strcmp函数 4.strcat函数 5.strstr函数 6.strtok函数 7.strerror与perror函数 8.字符操作函数 9.内存操作函数 10.总结 以上函数均属于库函数&#xff0c;有的函数则会介绍如何模拟实现。 一、strlen函数…

【DDPM论文解读】Denoising Diffusion Probabilistic Models

0 摘要 本文使用扩散概率模型合成了高质量的图像结果&#xff0c;扩散概率模型是一类受非平衡热力学启发的潜变量模型。本文最佳结果是通过根据扩散概率模型和朗之万动力学的去噪分数匹配之间的新颖联系设计的加权变分界进行训练来获得的&#xff0c;并且本文的模型自然地承认…

UE 虚幻引擎 利用LOD,Nanite技术优化场景性能

目录 0 引言1 LOD1.1 LOD定义1.2 UE5中的LOD技术1.3 HLOD&#xff08;Hierarchical Level of Detail&#xff09; 2 Nanite2.1 UE5的Nanite技术2.2 Nanite介绍2.2.1 Nanite的优势2.2.2 Nanite网格体与传统静态网格体的不同2.2.3 Nanite支持的类型2.2.4 在地形中使用Nanite 0 引…

递归,搜索与回溯

1.汉诺塔问题 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动…

VOP —— Noise

目录 Turbulent Noise —— 计算1D/3D类型的Noise Anti-Aliased Flow Noise —— 生成抗锯齿噪波 Anti-Aliased Noise —— 生成抗锯齿噪波 Curl Noise —— 创建divergence-free 3D噪波 Curl Noise 2D —— 创建divergence-free 2D噪波 Flow Noise —— 生成1D/3D Perli…

人力资源HR 怎么选择在线人才测评工具

测评已经是普及度很好了&#xff0c;不仅仅是大企业&#xff0c;中小企业也都在启用人才测评&#xff0c;也有叫素质测评等等&#xff0c;内容多样化。但是根本形式是一样的&#xff0c;那就是在线测评&#xff0c;目的也是一样的&#xff0c;就是为了招来最适合的职员。 而市…