线性表之-栈

news2024/11/25 22:55:29

栈的表示:

栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈,出数据也在栈顶。

栈结构的实现:

 栈结构可使用数组,单链表以及双向链表来实现

用数组实现:

相当于之前顺序表的尾插,尾插用尾做了栈顶,头做栈底,放入数据或拿出数据直接尾插或尾删即可,非常合适。

用单链表实现:

若将链表的尾部视为栈顶,头部视为栈底,删除数据时需找到倒数第二个节点,比较麻烦,这时可用双向链表实现。但若将链表的第一个节点视为栈顶,最后一个节点视为栈底,删除数据或添加数据直接头删或头插即可,入栈和出栈效率均为O(1)。

用双链表实现:

使用两个指针,每次插入申请,每次删除释放,效率较低

三者均可实现栈,在这里我就使用数组吧。

以下为准备工作(三个文件,头文件,函数定义文件,以及测试文件):

Stack.h
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int STDataType;//将int改名,便于维护代码
typedef struct Stack
{
	STDataType* a;
	int top;//栈顶
	int capacity;
}ST;
//初始化
void StackInit(ST* ps);
//销毁栈
void StackDestory(ST* ps);
//栈顶插入数据(入栈)
void StackPush(ST* ps,STDataType x);
//出栈
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);

栈的初始化:

可先给a开辟几个空间。初始化即可。

//初始化
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		printf("malloc fail\n");
		exit(-1);//不是正常结束
	}
	ps->capacity = 4;
	ps->top = 0;//意味着top指向的是栈顶元素的下一位,若为-1,则top指向的是栈顶元素
}

栈的销毁:

释放啊,其他设为0.

//销毁栈
void StackDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0; 
}

栈顶插入数据(入栈):

注意当top等于capacity时,要开辟新的空间

//栈顶插入数据(入栈)
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);//不是正常结束
		}
		else
		{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}
	ps->a[ps->top] = x;
	ps->top++;
}

出栈:

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);//栈空了,调用pop,直接中止程序报错
	ps->top--;
}

返回栈顶元素:

//返回栈顶元素
STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps -> a[ps->top - 1];
}

返回栈中数据的数目:

//返回栈中数据的数量
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

判断栈是否为空:

//判断是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

调用:

注意:读取数据时只能删一个读一个,不能随便访问(不能破坏栈的性质)

#include"Stack.h"
int main()
{
	ST st;
	StackInit(&st);
	StackDestory(&st);
	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	while (!StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);//只能先删一个再读一个,不能随便访问
	}
	printf("\n");

	return 0;
}

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

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

相关文章

YN 500U无法上网问题

版本信息 YN LU YN上问题现象 在后台ping&#xff0c;在web上抓包 抓包结构发现是收到回包了的 通过ssh登录到网关上抓包&#xff0c;也是一样&#xff0c;是可以抓到回应包的&#xff0c;但是终端上就是无法显示。 通过wan后ping包是能够看到回显的。 这块模组有问题

C++基础 -43- STL库之set集合

在set插入数据的时候会自动排序 set集合定义格式 int myints[] {50,10,40,30,20};set<int,classcomp> second (myints,myints5);设置排序方式 struct classcomp {bool operator() (const int& lhs, const int& rhs) const{return lhs>rhs;} };举例遍历se…

Web APIs—事件监听、事件类型、事件对象、环境对象、回调函数、综合案例:随机点名案例,轮播图完整版,评论区回车发布,Tab栏切换

版本说明 当前版本号[20231205]。 版本修改说明20231205初版 目录 文章目录 版本说明目录Web APIs - 第2天事件事件监听案例&#xff1a;通过点击按钮&#xff0c;弹出一个对话框 事件类型事件处理程序综合案例&#xff1a;随机点名案例 事件类型鼠标事件键盘事件焦点事件案…

为啥你的文案点击量少?快来看看是不是犯了这些误区

信息爆炸的时代下用户注意力成为稀缺资源&#xff0c;一篇文章如果不能在最开始就抓住读者的心就宛如石沉大海&#xff0c;而许多企业在写软文时总会因为点击量太少而焦虑&#xff0c;今天媒介盒子就来和大家分析分析&#xff0c;为啥你的文章点击量少&#xff0c;帮助企业搞清…

vue项目中添加刷新的按钮

刷新功能 点击导航的刷新按钮&#xff0c;刷新下方主体内容&#xff0c;我这边的项目分为左-上-下结构&#xff0c;上边为tabbar组件&#xff0c;下边为main组件&#xff0c;点击刷新整个流程是刷新按钮&#xff0c;去访问它父组件tabbar的兄弟组件main&#xff0c;使main组件…

渗透测试学习day7

文章目录 靶机&#xff1a;VaccineTask1Task2Task3Task4Task5Task6 7-9解题过程Task7Submit user flagSubmit root flag 靶机&#xff1a;Vaccine Task1 问题&#xff1a;除了SSH和HTTP&#xff0c;这个盒子上还托管了什么服务&#xff1f; ftpnmap扫一下 Task2 问题&…

活动目录是什么?

企业在进行数字化转型时&#xff0c;也会面临日益增长的网络用户和复杂的身份管理需求。为了高效地管理用户身份、控制访问权限以及保护企业的数据安全&#xff0c;许多企业选择使用微软的Active Directory&#xff0c;即微软活动目录&#xff0c;来作为网络身份管理系统。 1、…

概率密度函数(PDF)正态分布

概率密度函数&#xff08;PDF&#xff09;是一个描述连续随机变量取特定值的相对可能性的函数。对于正态分布的情况&#xff0c;其PDF有一个特定的形式&#xff0c;这个形式中包括了一个常数乘以一个指数函数&#xff0c;它假设误差项服从均值为0的正态分布&#xff1a; p ( …

算法通关村第十三关-白银挑战数字与数学高频问题

大家好我是苏麟 , 今天带来数字与数学的高频问题 . 加一 描述 : 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个…

D9741 应用于电视摄像机,笔记本电脑等产品中,3.6V ~ 35V 100mA 三极管驱动

D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点&#xff1a;● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电…

时间选择器

<el-form-item label"时间范围"><!-- <el-date-picker size"small"v-model"createTime"type"daterange"range-separator"至"start-placeholder"请输入起始创建时间"end-placeholder"请输入终止创…

【优选算法系列】【专题一双指针】第四节.15. 三数之和和18. 四数之和

文章目录 前言一、三数之和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、四数之和 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …

美股电动汽车股票分析:蔚来和Rivian这两只都遭受了重创的股票,哪个更值得投资?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Rivian(RIVN)和蔚来(NIO)都是目前美股市场上最受关注的电动汽车股票。虽然蔚来在全球最大的电动汽车市场中国扮演着重要角色&#xff0c;但Rivian也击败了很多传统汽车制造商&#xff0c;并成为了第一家在美国推出全电动皮…

Python爬虫完整代码模版——获取网页数据的艺术

Python爬虫完整代码模版——获取网页数据的艺术 在当今数字化世界中&#xff0c;数据是价值的源泉。如何从海量数据中提取所需信息&#xff0c;是每个数据科学家和开发者必须面对的问题。Python爬虫作为一种自动化工具&#xff0c;专门用于从网站上抓取数据。本文将提供一个Py…

Servlet作业1

1.【单选题】 (10分) &#xff08;B &#xff09;是一个用 Java 编写的程序&#xff0c;是一种实现了Servlet接口的类&#xff0c;它是由web容器负责创建并调用&#xff0c;在服务器容器上运行&#xff0c;用于接收和响应用户的请求。 A.Filter B.Servlet C.Request D.Res…

C语言之联合和枚举

C语言之联合和枚举 文章目录 C语言之联合和枚举1. 联合体1.1 联合体的声明1.2 联合体的特点1.3 结构体和联合体对比1.4 联合体大小的计算1.5 联合体小练习 2. 枚举2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用 1. 联合体 1.1 联合体的声明 像结构体⼀样&#xff…

C/C++,组合算法——K人活动选择问题(Activity-Selection-Problem)的源程序

1 活动选择问题 Activity-Selection-Problem with k persons 给定两个大小为 N 的数组S[]和E[]表示商店的开始和结束时间&#xff0c;以及一个整数值 K 表示人数&#xff0c; 任务是找出如果他们基于以下条件最佳地访问每个商店&#xff0c;他们总共可以访问的商店的最大数量…

UEC++ 探索虚幻5笔记(捡金币案例) day12

吃金币案例 创建金币逻辑 之前的MyActor_One.cpp&#xff0c;直接添加几个资源拿着就用 //静态网格UPROPERTY(VisibleAnywhere, BlueprintReadOnly)class UStaticMeshComponent* StaticMesh;//球形碰撞体UPROPERTY(VisibleAnywhere, BlueprintReadWrite)class USphereCompone…

《Pandas1.x实例精解 》书籍分享

Pandas介绍 Pandas&#xff1a;Python数据分析的瑞士军刀 在数据科学、机器学习和人工智能日益繁荣的今天&#xff0c;有效、准确地处理和分析数据已经成为了成功的关键。Python&#xff0c;作为一种强大且易于学习的编程语言&#xff0c;已经在这一领域占据了重要的地位。而…

面试多线程八股文十问十答第三期

面试多线程八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.介绍一下自旋锁 重量级锁竞争时&#xff0c;尝试获取锁的线程不会立即阻塞&…