线性表-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)

news2024/9/22 11:40:55

目录

前言

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/1013484.html

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

相关文章

聚观早报 | OPPO A2 Pro官宣;京东建材发布“1家1”计划

【聚观365】9月15日消息 OPPO A2 Pro官宣 京东建材发布“1家1”计划 谷歌开始新一轮“瘦身”计划 CapCut全球用户总支出超1亿美元 马斯克称特斯拉FSD安全性超过人类司机 OPPO A2 Pro官宣 去年11月&#xff0c;OPPO推出了A1 Pro&#xff0c;该机采用了120Hz OLED护眼曲屏&…

pyhton内置的数据类型(二)

pyhton内置的数据类型 一、内置数据类型的解释创建及赋值二、表示转义的符号实例操作 二、字符串的基本特性1.连接操作符 “ ” &#xff0c;提示&#xff1a;必须是同一数据类型才能相加2. 重复操作符 “ * ”3.成员操作符 “ in ”4. 正向索引和反向索引5. 切片&#xff08;…

Scholarcy:AI在线论文摘要总结工具

【产品介绍】 名称 scholarcy 成立/上线时间 2018年 具体描述 scholarcy是一个基于AI的在线论文文献摘要总结工具&#xff0c;可以帮助研究人员和学生快速阅读和理解各种类型的文献&#xff0c;如研究论文、报告和书籍章节。 scholarcy可以在几秒钟…

【Mybatis源码分析】插件机制和Pagehelper插件源码分析

分页插件Pagehelper源码分析 一、插件机制二、Pagehelper源码分析 前文叙述过以下内容&#xff1a;Mybatis对动态代理的使用&#xff0c;一二级缓存和懒加载的原理。其中二级缓存解释了在分布式环境下可能出现缓存不一致问题&#xff0c;但没说解决方案。其实个人认为这种问题除…

前端JavaScript中异步的终极解决方案:async/await

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 1. 背景 在深入讨论 async/await 之前&#xff0c;我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是…

编写postcss插件,全局css文件px转vw

跟目录下创建plugins文件夹&#xff0c;创建postcss-px-to-viewport.ts文件 文件内代码&#xff1a; // postcss 的插件 vite内置了postCss插件 无需安装 import { Plugin } from postcss;interface Options {viewportWidth: number }const Options {viewportWidth: 375, // …

mmdetection环境配置和安装

创建 openmmlab 虚拟环境 conda create -n openmmlab python3.7激活openmmlab环境 conda activate openmmlab安装torch 在torch官网查找安装自己电脑cuda对应的torch安装命令 conda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia使用 MIM …

Spring源码分析(三) bean的生命周期 createBean()和doCreateBean()

1、createBean() resolveBeforeInstantiation 也要详细介绍 打标机 protected Object createBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args)throws BeanCreationException {if (logger.isTraceEnabled()) {logger.trace("Creating instance of b…

家庭安全不容小觑!青犀AI智能分析算法+摄像头助力家庭安全

你知道吗&#xff1f;高层家庭更需要人工摄像头&#xff01;虽然现在社会治安十分稳定&#xff0c;高层建筑更是安全&#xff0c;但高层盗窃、陌生人入室这些新闻还是层出不穷&#xff0c;为了解决这些安全隐患&#xff0c;给广大人民一个安心的生活环境&#xff0c;旭帆科技将…

线性方程组

目录 线性方程组 齐次线性方程组 基础解系 非齐次线性方程组 线性方程组 线性方程组是数学中的一个基本概念&#xff0c;它是指由一组线性方程组成的方程组。线性方程组的一般形式为&#xff1a; a1x1 a2x2 ... anxn b1 a1x1 a2x2 ... anxn b2 ... a1x1 a2x2 ..…

处理更多数据,大幅降低成本!Milvus MMap 启示录

作为 VectorDBBench 中最快的开源向量数据库&#xff0c;Milvus 可以很好地为有高性能需求的用户服务。与此同时&#xff0c;我们也注意到一些用户会将 Milvus 用在离线业务中&#xff0c;还有部分用户对性能需求并不敏感&#xff0c;这意味着在同规格的实例上&#xff0c;他们…

AI绘画的崛起与多平台对比

目录 引言AI绘画技术的发展历程主流AI绘画平台概览DeepArt.ioPrismaNVIDIA Canvas 对比分析与评价画风迁移能力创造力和创新性使用便利性和用户体验是否开源与社区互动 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐渗透到我们生活的方方面面。…

国际版腾讯云/阿里云:全站加快有哪些功用?有哪些优势?适用于什么场景?

腾讯云全站加快有哪些功用&#xff1f;有哪些优势&#xff1f;适用于什么场景&#xff1f; 产品功用 全站加快 ECDN 经过在全球各区域部署加快节点&#xff0c;有用下降跨国拜访推迟&#xff0c;保证全球加快作用。 最优链路 各加快节点两两相连&#xff0c;实时勘探&#xff0…

【CentOS7】vsftpd学习笔记

2023年9月14日&#xff0c;周四下午 目录 安装vsftpd添加账号给账户设置新密码开放21号端口关闭21号端口查看vsftpd的运行状态启动vsftpd关闭vsftpd查看CentOS7的IP地址在Windows测试你的运行在CentOS7的用vftpd构建的FTP服务器查看Windows自带的ftp程序有哪些可用的命令 安装…

AI生成文章-AI文章生成工具

随着社会的发展人工智能技术的突破&#xff0c;越来越多的人开始使用AI来生成文章&#xff0c;但是有一个问题一直困扰着大家&#xff1a;AI生成的文章会不会变得千篇一律&#xff0c;重复无新意呢&#xff1f; AI生成文章的兴起 让我们简要回顾一下AI生成文章的兴起。随着深度…

一款功能齐全的网管软件:Ip-tools

摘要 Ip-tools是一款功能齐全的网管软件&#xff0c;可以随时随地的向网管员报告网络的运行情况ip-tools自身集成多种tcp/ip使用工具&#xff0c;如本地信息、网络监视器、NetBIOS信息查看器、共享扫描、SNMP扫描、主机名扫描、端口扫描、UDP扫描、ping工具、路由追踪工具、Tel…

【接口自动化测试】Eolink Apilkit 安装部署,支持 Windows、Mac、Linux 等系统

Eolink Apikit 有三种客户端&#xff0c;可以依据自己的情况选择。三种客户端的数据是共用的&#xff0c;因此可以随时切换不同的客户端。 我们推荐使用新推出的 Apikit PC 客户端&#xff0c;PC 端拥有线上产品所有的功能&#xff0c;并且针对本地测试、自动化测试以及使用体…

竞赛 基于机器视觉的停车位识别检测

简介 你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里&#xff0c;那是不是很爽&#xff1f;事实证明&#xff0c;基于深度学习和OpenCV解决这个问题相对容易&#xff0c;只需获取停车场的实时视频即可。 该项目较为新颖&#xf…

安卓设备文件传输助手 MacDroid pro for mac中文

MacDroid是一款方便实用的软件&#xff0c;可帮助您在Mac和Android设备之间进行文件传输和管理。它提供了USB和无线连接选项&#xff0c;支持简单的设备连接和快速的文件传输。无论是备份照片、传输音乐&#xff0c;还是管理文件&#xff0c;MacDroid都是一个方便的工具。 除了…

Java“牵手”速卖通商品详情数据,速卖通商品详情接口,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台&#xff0c;被称为国际版淘宝&#xff0c;速卖通面向海外买家客户&#xff0c;通过支付宝国际账户进行担保交易&#xff0c;并使用国际物流渠道运输发货&#xff0c;是全球第三大英文在线购物网站。 速卖通商品详情数据…