【数据结构—栈的实现(数组栈)】

news2024/12/25 12:49:09

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

一、栈

1.1栈的概念及结构

二、栈的实现

2.1头文件的实现—Stack.h

2.2源文件的实现—Stack.c

2.3源文件的测试—test.c

三、栈的实际测试数据展示

3.1正常的出入栈展示:

3.2进栈同时也在出栈的展示:


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

一、栈

1.1栈的概念及结构

数组:数组一般适合尾插和尾删,所以一般栈顶在尾部。
双向链表实现:尾插、尾删和头插、头删都一样,都符合后进先出的原则,所以栈顶可以是头,也可以是尾。
单链表实现:适合头插和头删,栈顶只能是头。

栈的规则:后进去的要先出来(后进先出)联想弹夹

top:两种设计方案
1、如果top指向栈顶元素,设空栈时,给top == 0,那么当空栈中插入一个元素时,由于top指向的是栈顶元素,top还是0,此时没法区分到底是空栈还是有一个元素的栈,那就设空栈时,给top == -1,当在栈中插入一个元素时,top == 0;
2、如果top指向栈顶元素的下一个位置,设空栈时,给top == 0,当在栈中插入一个元素时,top指向栈顶元素的下一个位置,所以top == 1(也可以看成top就是栈中的数据个数)

二、栈的实现

2.1头文件的实现—Stack.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>


typedef int STDataType;
typedef struct stack
{
	STDataType* a;
	int top;//标识栈顶的位置
	int capacity;
}ST;

//初始化
void STInit(ST* pst);
//销毁
void STDestory(ST* pst);

//压栈
void STPush(ST* pst, STDataType x);
//出栈
void STPop(ST* pst);

//获取栈顶元素
STDataType STTop(ST* pst);

//判空
bool STEmpty(ST* pst);

//统计栈内元素个数
int STSize(ST* pst);

2.2源文件的实现—Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"

//初始化
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	//表示top指向栈顶元素的下一个位置
	pst->top = 0;

	//表示top指向栈顶元素
	//pst->top = -1;

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

//压栈
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	//判断数组栈空间是否足够
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}

//获取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	return pst->a[pst->top - 1];
}

//判空
bool STEmpty(ST* pst)
{
	assert(pst);
	//判断数组栈为空
	//1、如果top是指向栈顶元素的下一个位置,那当top == 0时,栈为空
	//2、如果top时指向栈顶元素,那当top == -1时,栈为空
	/*if (pst->top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}*/
	return pst->top == 0;
}

//统计栈内元素个数
int STSize(ST* pst)
{
	assert(pst);
	//1、如果top指向栈顶元素的话,栈内元素的个数为top+1;
	//2、如果top指向栈顶元素的下一个位置的话,栈内元素的个数为top;
	return pst->top;
}

2.3源文件的测试—test.c

#include "Stack.h"

int main()
{
	ST s;
	STInit(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);
	printf("%d ", STTop(&s));
	STPop(&s);
	STPush(&s, 4);
	STPush(&s, 5);

	//入栈顺序(一种)  --  出栈顺序(多种)
	//是一对多的关系
	while (!STEmpty(&s))
	{
		printf("%d ", STTop(&s));
		STPop(&s);
	}
	printf("\n");
	return 0;
}

三、栈的实际测试数据展示

1.栈的出栈和入栈的关系是:一对多的关系
2.元素出入栈的规则:
后进先出

3.1正常的出入栈展示:

3.2进栈同时也在出栈的展示:

总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

好用便签类工具有哪些?让上班族更轻松一些

想象一下你坐在电脑前&#xff0c;正在为即将到来的会议做准备&#xff0c;你需要整理一些重要的信息&#xff0c;以免在会议中遗漏关键内容。可是&#xff0c;你的电脑桌面上堆满了各种文件和图标&#xff0c;让你感到有些凌乱。这时&#xff0c;好用的便签类工具就成了你的救…

使用Allure框架创建个性化测试报告的步骤

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

FindMy技术用于手表

手表是一种用于计时和显示时间的仪器&#xff0c;通常由机械、电子或石英等机制驱动。手表可以作为配饰佩戴在手腕上&#xff0c;具有方便携带、时尚美观等特点。手表的种类和款式很多&#xff0c;可以根据不同的需求和场合进行选择。常见的手表类型包括机械表、石英表、电子表…

如何进行产品数据分析一——移动应用APP分析方法

如何进行产品数据分析 产品的定义产品分析的构成移动应用APP分析方法AARRR1.流量拆解DAUMAU活跃率拆解流量深度 2.流量引入反作弊算法识别系统&#xff08;量&#xff09;拉新质量评估体系&#xff08;质&#xff09;渠道价值评估体系&#xff08;值&#xff09; 3.流量输出 产…

同义词替换器降低论文重复率的最新技术进展

大家好&#xff0c;今天来聊聊同义词替换器降低论文重复率的最新技术进展&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;同义词替换器降低论文重复率的最新技术进展 一、引言 随着学术…

RK3568全国产化多网口板卡带poe供电,支持鸿蒙麒麟系统

信迈XM-3568-01主板采用瑞芯微RK3568四核Cortex-A55 处理器&#xff0c;主频最高可达2.0GHz&#xff0c;效能有大幅提升最高可配8GB内存容量&#xff0c;频率高达1600MHz&#xff1b;支持全链路ECC&#xff0c;让数据更安全可靠配置双千兆自适应RJ45以太网口&#xff0c;并扩展…

kernel32.dll如何解决,教你如何快速修复kernel32.dll文件缺失问题

kernel32.dll是Windows操作系统中非常重要的一个动态链接库文件&#xff0c;它提供了许多系统级的功能和服务。本文将介绍kernel32.dll动态链接库报错的五种解决方法&#xff0c;并探讨kernel32.dll丢失对电脑的影响以及其作用的介绍。 一、kernel32.dll动态链接库报错的五种解…

每日一练2023.12.13——6翻了【PTA】

题目链接&#xff1a;L1-058 6翻了 题目要求&#xff1a; “666”是一种网络用语&#xff0c;大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”&#xff0c;意思是“6翻了”&#xff0c;实在太厉害的意思。如果你以为这就是厉害的最高境界&#xff0c;那…

docker容器-compose单机容器编排

yaml文件&#xff1a;是一种标记语言&#xff0c;以竖列的形式展示序列化的数据格式&#xff0c;可读性高 类似于json格式&#xff0c;语法简单 yaml通过缩进来表示数据结构&#xff0c;连续的项目用-减号来表示 yaml文件使用的注意事项 1、大小写敏感 2、通过缩进表示层级…

Python 递归及目录遍历

递归调用&#xff1a;一个函数&#xff0c;调用了自身&#xff0c;称为递归调用 递归函数&#xff1a;一个会调用自身的函数 凡是循环能做的事&#xff0c;递归都能做。 目录 递归示例 普通方法实现 递归方式实现 计算分析&#xff1a; 递归遍历目录 引入os 遍历目录 执…

安防视频/可视化监控云平台EasyCVR对接大华卡口摄像头告警的操作步骤

旭帆科技的国标GB28181视频融合平台EasCVR不仅具备传统的视频监控功能&#xff0c;还配备了智能分析算法&#xff0c;近期有用户需要在现场的摄像头配备AI识别的功能&#xff0c;如烟火、人脸识别、车牌识别等功能。 最新版的EasyCVR&#xff08;V.3.4&#xff09;目前可对接大…

DBA轻松应对慢查询挑战,使用NineData这款工具就够了!

对于一个 DBA 来说&#xff0c;从公司数据库系统的稳定程度可以看出他的能力几何&#xff0c;一个优秀的 DBA 不仅要保证数据库的稳定运行&#xff0c;还需要有能力有效处理数据库的各种突发性能问题&#xff0c;而最常见的性能问题&#xff0c;就是慢查询。 我们公司规模比较…

Linux基础项目开发2:物联网监控——MJP-streamer方案实现(二)

前言&#xff1a; MJPG-Streamer代码简单&#xff0c;并且对CPU的要求比较低&#xff0c;一般的处理器都能运行&#xff0c;我们可以通过它&#xff0c;大体了解一下视频监控的知识。 一、MJP-streamer 编译安装MJP-streamer 使用Buildroot编译 在100ASK_IMX6ULL上安装、运行 使…

通讯系列电路芯片选型分析

适用于电话机上的电路芯片D34018 工作电压范围6V&#xff5e;11V 采用SOP28封装形式 D34118 工作电压范围3.5V&#xff5e;6.5V 采用SOP28封装形式 压缩扩展器电路芯片D31101 D5015 D5020 窄带中频放大器电路D3361 D3380 D31136 收发器电路芯片 D232 低功耗3-5.5V供电RS-2…

-bash: docker-compose: 未找到命令

-bash: docker-compose: 未找到命令 我在使用Docker搭建Nacos容器时遇到了这个问题&#xff1a;是没有安装 docker-compose工具 。 docker-compose的用处主要体现在以下几个方面&#xff1a; 快速搭建开发环境&#xff1a;使用docker-compose可以快速搭建起开发环境&#xff0…

全球十大骨传导耳机排名,骨传导耳机排行榜品牌推荐

随着科技的进步&#xff0c;人们对音乐和通话的需求越来越高&#xff0c;而骨传导耳机作为一种新兴的耳机类型&#xff0c;逐渐受到人们的关注。它通过人的头骨将声音直接传递到内耳&#xff0c;不经过耳道&#xff0c;因此不会阻碍外界声音的进入&#xff0c;同时也能更好地保…

pytorch强化学习(1)——DQNSARSA

实验环境 python3.10 torch2.1.1 gym0.26.2 gym[classic_control] matplotlib3.8.0 numpy1.26.2DQN代码 首先是module.py代码&#xff0c;在这里定义了网络模型和DQN模型 import torch import torch.nn as nn import numpy as npclass Net(nn.Module):# 构造只有一个隐含层的…

【Python】计算最少排班人数(1)

需求背景&#xff1a; 某工作24小时需要人员&#xff0c;单个班次为8或9小时&#xff0c;需要根据每小时需要的人数、不同的班次计算最低需要的人数。 每小时需要的人数举例&#xff1a; 班次类型&#xff1a; 问题分析&#xff1a; 1、需要各个时段的人员数大于等于需要的人…

CV中的Attention机制:SENet

paper: Squeeze-and-Excitation Networks paper link:https://arxiv.org/pdf/1709.01507.pdf repo link:GitHub - hujie-frank/SENet: Squeeze-and-Excitation Networks 摘要&#xff1a; 卷积神经网络&#xff08;CNNs&#xff09;的核心构建块是卷积算子&#xff0c;它使…

微信小程序map视野发生改变时切换定位点

<!--地图--> <view><map id"myMap" style"width: 100%; height: 300px;" latitude"{{latitude}}" longitude"{{longitude}}"scale"{{scale}}" markers"{{markers}}" controls"{{controls}}&q…