【数据结构】超详细之实现栈

news2024/11/25 22:20:28

栈的实现步骤

  • 栈的介绍
  • 栈的初始化
  • 栈的插入(入栈)
  • 栈的出栈
  • 获取栈顶元素
  • 获取栈中有效元素个数
  • 检测栈是否为空
  • 销毁栈
  • 栈元素打印

栈的介绍

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

栈的初始化

在这里插入图片描述

//.h头文件内
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
//数组类型栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;//栈顶
	int capacity;//容量
}Stack;
// 初始化栈 
void StackInit(Stack* ps);

//.c逻辑文件


// 初始化栈 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->a = NULL;
	//ps->top = -1;//top栈顶初始化为-1最后会指向栈顶元素
	ps->top = 0;//top栈顶初始化为0最后会指向栈顶元素的下一个位置
	ps->capacity = 0;
}

栈的插入(入栈)

//.h头文件
// 入栈 
void StackPush(Stack* ps, STDataType data);

//.c逻辑文件
// 入栈 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->capacity == ps->top)
	{
		int num = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * num);
		if (tmp == NULL)
		{
			perror("realloc fail:");
			return;
		}
		ps->a = tmp;
		ps->capacity = num;
	}
	ps->a[ps->top] = data;
	ps->top++;
}

栈的出栈

//.h文件
// 出栈 
void StackPop(Stack* ps);

//.c逻辑文件
// 出栈 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}

获取栈顶元素

//.h头文件
// 获取栈顶元素 
STDataType StackTop(Stack* ps);

//.c逻辑文件
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}

获取栈中有效元素个数

//.h头文件
// 获取栈中有效元素个数 
int StackSize(Stack* ps);

//.c逻辑文件
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->top;
}

检测栈是否为空

//.h头文件
// 检测栈是否为空,如果为空返回false,如果不为空true
bool StackEmpty(Stack* ps);

//.c逻辑文件
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

销毁栈

//.h头文件
// 销毁栈 
void StackDestroy(Stack* ps);

//.c逻辑文件
// 销毁栈 
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

栈元素打印

想打印栈内元素,不能跟顺序表与链表一样定义打印函数,因为栈规定“先进后出”原则,因此想打印栈内元素,我们要在测试文件中打印
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void test1()
{
	Stack ps;
	// 初始化栈 
	StackInit(&ps);
	StackPush(&ps,1);
	StackPush(&ps,2);
	StackPop(&ps);
	StackPush(&ps,3);
	StackPush(&ps,4);
	int num = StackSize(&ps);
	printf("%d\n", num);
	//打印栈(栈的打印与顺序表链表不同,不能定义一个专门用于打印的函数,因为栈要遵循先进后出原则)
	while (!StackEmpty(&ps))
	{
		printf("%d ", StackTop(&ps));
		StackPop(&ps);
	}
	// 销毁栈 
	StackDestroy(&ps);
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

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

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

相关文章

快捷转换/互转 Markdown 文档和 TypeScript/TypeDoc 注释

背景 作为文档工具人&#xff0c;经常需要把代码里面的注释转换成语义化的 Markdown 文档&#xff0c;有时也需要进行反向操作。以前是写正则表达式全局匹配&#xff0c;时间长了这种方式也变得繁琐乏味。所以写了脚本来互转&#xff0c;增加一些便捷性。 解决方案 注释转 M…

【C++】初遇C++

认识C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(object orient…

学好网络安全,每年究竟能挣多少钱呢?

薪资的高低&#xff0c;应该是想要转行网络安全的同学最关心的话题了。毕竟薪资是个人水平和自我价值的体现嘛。&#xff08;文末资料&#xff09; 今天就展开谈谈网络安全行业的薪资吧。 先来看张图&#xff0c; 大家在求职时都有一个期望薪资&#xff0c;企业会有一个实际薪…

5月的面试难度有点大....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

R语言实践——使用rWCVP映射多样性

使用rWCVP映射多样性 加载库工作流1. 物种丰富度2. 特有物种丰富度3. 特定区域的物种热力图 加载库 library(rWCVP) library(tidyverse) library(sf) library(gt)工作流 1. 物种丰富度 我们可以使用 wcvp_summary 将所有物种的全球出现数据压缩为每个 WGSRPD 3 级区域的原始…

chatgpt赋能python:Python三角函数角度的介绍

Python三角函数角度的介绍 Python语言为各种计算提供了强大的支持。而Python在数学领域的支持更是非常强大&#xff0c;包括对三角函数角度的计算。在Python中&#xff0c;支持常用的三角函数&#xff0c;例如sin、cos、tan等。这些函数都需要将角度转换为弧度&#xff0c;并且…

车载网络测试 - CANCANFD - 基础篇_01

目录 问题思考&#xff1a; 一、为什么需要总线? 二、什么是CAN总线? 三、为什么是CAN总线? 四、曾经的车用总线 1、SAEJ1850(Class2) 2、SAEJ1708 3、K-Line 4、BEAN 5、 byteflight, K-Bus 6、D2B 五、当前的车用总线 1、CAN 2、LIN 3、FlexRay 4、MOST 六…

C#中的DataGridView中添加按钮并操作数据

背景&#xff1a;最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮&#xff0c;用来对数据的操作以及显示。 在DataGridView中显示需要的按钮 首先在DataGridView中添加需要的列&#xff0c;此列是用来存放按钮的。 然后在代码中“画”按钮。 if (e.Column…

你知道什么叫三目表达式吗

目录 什么是三目表达式&#xff1f; 运用 1.单个使用 2.嵌套使用 什么是三目表达式&#xff1f; 1.三目表达式是一种编程中常见的表达式,它能够有效地帮助我们解决一些问题。 2.三目表达式由三个部分组成,分别是:条件表达式、结果表达式 听不懂么&#xff0c;那我们就来举个…

网页制作-技术学习笔记

PxCook PxCook测量像素工具下载 https://www.fancynode.com.cn/pxcookPxCook基本操作 通过软件打开设计图 打开软件 创建web项目 拖拽入设计图&#xff0c;png用设计模式 psd用开发模式 常用快捷键 放大设计图&#xff1a;ctrl 缩小设计图&#xff1a;ctrl - - 移动…

一、STM32开发环境的搭建(Keil+CubeMX)

1、STM32开发环境所需的东西 (1)KeilMDK安装包。 (2)STM32CubeMX。 (3)Keil软件对应的单片机pack包。 (4)STM32Cube MCU包。 2、Keil简介及安装 略 3、CubeMX简介及安装 3.1、CubeMX简介 (1)STM32CubeMX是一种图形工具&#xff0c;通过分步过程可以非常轻松地配置STM3…

Flutter 可冻结的侧滑表格 sticky-headers-table 结合 NestedScrollView 吸顶悬浮的使用实践

最近在做flutter web的开发&#xff0c;需要做一个类似云文档中表格固定顶部栏和左侧栏的需求&#xff0c;也就是冻结列表的功能 那么在pub上呢也有不少的开源库&#xff0c;比如&#xff1a; table_sticky_headers data_table_2 如果说只是简单的表格和吸顶&#xff0c;那么这…

cf1750E Bracket Cost

前言&#xff1a; 好久没训练了,来做道计数题找找感觉。**期末毁我青春 大意&#xff1a; 定义对于一个括号串 s的值&#xff0c;为通过最小次数以下操作使 s 实现括号匹配的操作次数。 选择一个子串&#xff0c;循环右移一位。在任意一个位置插入一个任意括号。 求一个括…

【Python 变量和数据类型】零基础也能轻松掌握的学习路线与参考资料

一、Python 变量 Python 变量是数据储存的地方&#xff0c;使用变量可以在程序中持续存储数据&#xff0c;Python 中的变量可以储存任何类型的数据&#xff0c;如文本、数字、列表、元组、字典等。下面是 Python 变量学习路线&#xff1a; 1. 了解 Python 变量 Python 变量是…

【Python pygame】零基础也能轻松掌握的学习路线与参考资料

Python pygame是一款专门用于开发游戏和多媒体应用程序的Python库。它可以帮助开发者实现丰富多彩的图形界面和实时动态交互效果。本篇文章将为大家介绍Python pygame的学习路线&#xff0c;包括入门基础、进阶知识以及优秀实践&#xff0c;帮助大家了解Python pygame并掌握其开…

STM32G0x0系列-点亮一盏灯(寄存器)

目录 输入功能 浮空输入:通俗讲就是让管脚什么都不接&#xff0c;悬空着。 上拉输入 下拉输入 模拟输入 输出功能 开漏输出 推挽输出 相关寄存器 GPIOx_MODER 端口模式寄存器 GPIOx_OTYPER 端口输出类型寄存器 GPIOx_ OSPEEDR 端口输出速度寄存器 GPIOx_PUPDR 上拉…

腾讯云服务器使用教程,手把手教你入门

腾讯云服务器使用教程包括注册账号实名认证、选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置、安全设置和云服务器远程连接、安全组端口开通教程、云服务器环境部署以搭建网站为例手把手网站上线&#xff0c;云服务器文件传输和数据备份以及技术支持等详细说明&#…

葵花(Himawari)8/9卫星数据处理

李国春 葵花8&#xff08;含葵花9&#xff0c;下同&#xff09;是静止气象卫星&#xff0c;数据范围是星下点为140E赤道上空的大圆盘。空间分辨率有500m、1km和2km三种。虽然其空间分辨率不高&#xff0c;但是有极高的时间分辨率&#xff0c;观测数据刷新仅10分钟。这对一些生…

数据结构中“树”的全面讲解

文章目录 一、树结构的定义与对比二、树的存储结构是什么&#xff0c;都有哪些存储结构&#xff1f;双亲表示法&#xff1a;孩子表示法&#xff1a;孩子兄弟表示法&#xff1a; 一、树结构的定义与对比 ​ 树结构是一种一对多的非线性结构&#xff0c;它是由n&#xff08;n>…

第1关:ODBC程序设计

第1关&#xff1a;ODBC程序设计 任务描述相关知识ODBC主要功能ODBC接口主要函数ODBC应用程序开发实例DM ODBC应用程序开发总体流程DM ODBC代码编写流程DM ODBC代码编写实例 编程要求测试说明代码参考&#xff1a; 任务描述 本关任务&#xff1a;使用 ODBC 查询表中数据。 相关…