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

news2024/11/27 19:39:08

目录

前言

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.coloradmin.cn/o/1023232.html

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

相关文章

登录业务实现

登录业务实现&#xff1a; 登录成功/失败实现 -> pinia管理用户数据及数据持久化 -> 不同登录状态的模板适配 -> 请求拦截器携带token -> 退出登录实现 -> token失效&#xff08;401响应拦截&#xff09; 1. 登录成功/失败实现 当表单校验通过时&a…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署odoo开源ERP平台

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署odoo开源ERP平台 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例使用场景1.3 云耀云服务器L实例特点 二、odoo介绍2.1 odoo简介2.2 odoo特点 三、本次实践介绍3.1 本次实践简介3.2 本…

解决Java应用程序中的SQLException:服务器时区值未识别问题;MySQL连接问题:服务器时区值 ‘Öйú±ê׼ʱ¼ä‘ 未被识别的解决方法

目录 ​编辑 问题背景 解决方案 问题背景 今天遇见一个这个问题&#xff0c;解决后发出来分享一下&#xff1a; java.sql.SQLException: The server time zone value is unrecognized or represents more than one time zone. You must configure either the server or J…

STP介绍

目录 STP概述 二层环路带来的问题 1.广播风暴 2.MAC地址漂移问题 3.多帧复制---这个好理解&#xff0c;同一个数据帧被重复收到多次&#xff0c;被称为多帧复制。 802.1D生成树 STP的BPDU BPDU主要分为两大类 配置BPDU RPC COST 配置BPDU的工作过程 TCN BPDU TCN…

【python爬虫】——历史天气信息爬取

文章目录 1、任务描述1.1、需求分析1.2 页面分析 2、获取网页源码、解析、保存数据3、结果展示 1、任务描述 1.1、需求分析 在2345天气信息网2345天气网依据地点和时间对相关城市的历史天气信息进行爬取。 1.2 页面分析 网页使用get方式发送请求&#xff0c;所需参数包括a…

c语言练习63:用malloc开辟二维数组的三种办法

用malloc开辟二维数组的三种办法 使用malloc函数模拟开辟一个3*5的整型二维数组&#xff0c;开辟好后&#xff0c;使用二维数组的下标访问形式&#xff0c;访问空间。 第一种办法&#xff1a;用指针数组&#xff1a; #include<stdio.h> int main() {int** p (int**)m…

2023-09-19 LeetCode每日一题(打家劫舍 IV)

2023-09-19每日一题 一、题目编号 2560. 打家劫舍 IV二、题目链接 点击跳转到题目位置 三、题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取…

【C++代码】二叉树的最大深度,二叉树的最小深度,完全二叉树的节点个数--代码随想录

题目&#xff1a;二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 题解 如果我们知道了左子树和右子树的最大深度 l 和 r&#xff0c;那么该二叉树的最大深度即为 m a x ( l , r ) …

令人惊艳的AI项目,这也太猛了...

大家好&#xff0c;我是 Jack。 这两天&#xff0c;我在网上冲浪&#xff0c;发现了一款神器&#xff01; 我在使用 AI 绘画 Stable Diffsuion 和 Midjourney 的时候&#xff0c;花费时间最多的就是写 prompt 描述词了&#xff0c;绞尽脑汁地调试 prompt。 同样&#xff0c;…

pdf怎么转换成word?推荐这几种方法

pdf怎么转换成word&#xff1f;pdf转换成Word是一项常见的需求&#xff0c;首先&#xff0c;Word文档是一种常用的文档格式&#xff0c;几乎在任何计算机上都可以打开和编辑。与PDF相比&#xff0c;Word文档更加灵活和可编辑&#xff0c;可以轻松地修改和更新文档内容。在使用这…

macOS文件差异比较最佳工具:Beyond Compare 4

Beyond Compare for mac是一款Scooter Software研发的文件同步对比工具。你可以选择针对多字节的文本、文件夹、源代码&#xff0c;甚至是支持比对adobe文件、pdf文件或是整个驱动器&#xff0c;检查其文件大小、名称、日期等信息。你也可以选择使用Beyond Compare合并两个不同…

《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组下三角矩阵

《数据结构、算法与应用C语言描述》使用C语言实现二维数组下三角矩阵 下三角矩阵定义 如下图所示&#xff1a; 代码实现 _11lowerTriangularMatrix.h 模板类 /* Project name : allAlgorithmsTest Last modified Date: 2022年8月13日17点38分 Last Version: V1.0 D…

Linux-文件和目录权限

文章目录 权限的作用普通文本文件的权限作用 权限的作用 权限对于普通文件和目录文件的作用是不一样的。 普通文本文件的权限作用 drwxr-xr-x第二个字母开始是文件的权限表示9列权限&#xff0c;前三列表示文件的"拥有者"对该文件具有的权限&#xff0c;中三列表…

235. 二叉搜索树的最近公共祖先 Python

文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足…

C++:string的模拟实现

目录 1.string的四大默认函数 1.1构造函数 1.2析构函数 1.3拷贝构造 1.4赋值运算符重载 2.访问string的三种方式 2.1[]访问 2.2迭代器访问 2.3范围for(本质是迭代器) 3.string相关功能的实现 3.1modify 3.2capacity 3.3access 3.4relations 3.5补充 4.补充 1.s…

基于Appium的UI自动化测试

为什么需要UI自动化测试 移动端APP是一个复杂的系统&#xff0c;不同功能之间耦合性很强&#xff0c;很难仅通过单元测试保障整体功能。UI测试是移动应用开发中重要的一环&#xff0c;但是执行速度较慢&#xff0c;有很多重复工作量&#xff0c;为了减少这些工作负担&#xff…

八大排序(二)--------冒泡排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

高端知识竞赛中用到的软件和硬件有哪些

现在单位搞知识竞赛&#xff0c;已不满足于用PPT放题&#xff0c;找几个简单的抢答器、计分牌弄一下了&#xff0c;而是对现场效果和科技感要求更高了。大屏要分主屏侧屏&#xff0c;显示内容要求丰富炫酷&#xff1b;选手和评委也要用到平板等设备&#xff1b;计分要大气些&am…

QT在安装后添加新组件【QT基础入门 环境搭建】

一、Qt的安装目录下找到MaintenanceTool工具 二、双击该exe文件运行该工具(界面可能不相同但功能一样) 登录账号,进入以下界面,点击下一步 选择更新组件,出现以下提示 三、此时需要手动添加储存库 1.进入下面网站,选择一个国内镜像 Qt Downloads 点击后面的HTTP可进入…

java CAS详解(深入源码剖析)

CAS是什么 CAS是compare and swap的缩写&#xff0c;即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作&#xff0c;而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住&#xff0c;等之前获得锁的线程释放锁之后&am…