数据结构之栈详解(C语言手撕)

news2024/11/16 9:23:43

在这里插入图片描述

在这里插入图片描述

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉 ————————————————————————————

🎉文章简介

🎉本篇文章对 用C语言实现栈等相关知识 学习的相关知识进行分享!🎉💕

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
————————————————

一.栈的概念及结构

1.1栈的概念

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶;
出栈:栈的删除操作叫做出栈。出数据也在栈顶;

1.2栈的结构

在这里插入图片描述入数据和出数据都是从栈顶入和出;保持后进先出的原则*

1.3栈的实现

栈的实现:数组和链表都可以用来实现栈,保证先进后出原则;
数组:尾插就是进栈 尾删就是出栈(相比链表较为方便)
在这里插入图片描述我这里定义的是Top指向的是栈顶元素的下一个位置

链表:可以选择头插进栈 头删出栈
如果选择的是尾插和尾删的话,需要找尾灯操作,不方便

在这里插入图片描述

1.4栈的实现

数组实现栈(相对于链表,数组实现栈更优)

1.4.1功能函数的实现

一般的栈需要完成这几个函数

  1. 栈的初始化
  2. 栈的销毁
  3. 入栈
  4. 出栈
  5. 取栈顶元素
  6. 判断栈是否为空
void StackInit(ST* st);
void StackDestory(ST* st);

void StackPush(ST* st, STDateType x);
void StackPop(ST* st);

STDateType GetTop(ST* st);
bool StackEmpty(ST* st);

1.定义一个栈的结构体

这里我们实现的是动态的栈
typedef int STDateType;    //方便数据类型的替换
typedef struct Stack        
{
	STDateType* a;         //存储数据的数组
	int top;               
	int capacity;          //容量
}ST;

2.栈的初始化

这里top的初始化不同,top含义就不同;
1.如果top初始化给0,则每次入栈后top就会++;当入第一个数据时,top++后为1,则top含义为指向的是栈顶元素的下一个元素
2.如果top初始化为-1,则含义为指向栈顶元素
void StackInit(ST* st)
{
	assert(st);

	st->a = (STDateType* )malloc(4 * sizeof(STDateType));   
	if (st->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	st->top = 0;             //指向栈顶元素的下一个位置
	st->capacity = 4;        //初始容量给4
}   


3.入栈函数

void StackPush(ST* st, STDateType x)
{
	assert(st);

	if (st->top == st->capacity)      //扩容逻辑与顺序表一样
	{
		//扩容
		STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);
		if (tmp == NULL)     
		{
			perror("malloc fail");
			exit(-1);
		}
		st->a = tmp;
		st->capacity *= 2;     //2倍扩容
	}

	st->a[st->top] = x;      //尾插数据
	st->top++;
}

4.出栈函数

直接将top--;top--后虽然数据没有改变,但是在下一次入栈时会将原数据给覆盖
void StackPop(ST* st)
{
	assert(st);

	st->top--;
}

5.获取栈顶元素

STDateType GetTop(ST* st)
{
	assert(st);
	assert(st->top);            //断言
	
	return st->a[st->top - 1];    //直接返回top后一个位置的元素
}

6.判断栈是否为空

bool StackEmpty(ST* st)
{
	assert(st);

	return st->top;      //返回栈的top,如果为0则为空   非0则不为空;
}

7.栈的销毁函数

void StackDestory(ST* st)
{
	assert(st);

	free(st->a);    //释放开辟的空间
	st->capacity = st->top = 0;    //置空
}

1.5总代码

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



typedef int STDateType;
typedef struct Stack
{
	STDateType* a;
	int top;
	int capacity;
}ST;

void StackInit(ST* st);
void StackDestory(ST* st);

void StackPush(ST* st, STDateType x);
void StackPop(ST* st);

STDateType GetTop(ST* st);
bool StackEmpty(ST* st);

#include"Stack.h"

void StackInit(ST* st)
{
	assert(st);

	st->a = (STDateType* )malloc(4 * sizeof(STDateType));
	if (st->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	st->top = 0;
	st->capacity = 4;
}


void StackPush(ST* st, STDateType x)
{
	assert(st);

	if (st->top == st->capacity)
	{
		//扩容
		STDateType* tmp = (STDateType* )realloc(st->a,sizeof(STDateType) * st->capacity *2);
		if (tmp == NULL)
		{
			perror("malloc fail");
			exit(-1);
		}
		st->a = tmp;
		st->capacity *= 2;
	}

	st->a[st->top] = x;
	st->top++;
}

void StackPop(ST* st)
{
	assert(st);

	st->top--;
}

STDateType GetTop(ST* st)
{
	assert(st);
	assert(st->top);
	
	return st->a[st->top - 1];
}


bool StackEmpty(ST* st)
{
	assert(st);

	return st->top;
}

void StackDestory(ST* st)
{
	assert(st);

	free(st->a);
	st->capacity = st->top = 0;
}

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

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

相关文章

「2024指南」tf卡格式化了数据怎么恢复?

咨询&#xff1a;我把TF卡插入了我的安卓手机并将其设为内部存储&#xff0c;然后保存了大量重要资料。不久后&#xff0c;我无意中将TF卡拔出。当我再次插入时&#xff0c;手机提示必须格式化TF卡。我不小心点击了格式化选项&#xff0c;导致里面所有重要的资料都不见了。请问…

Java基础语法深入讲解

Java是一种面向对象的编程语言&#xff0c;由Sun Microsystems公司于1995年发布。它被设计为具有跨平台兼容性&#xff0c;这得益于Java虚拟机&#xff08;JVM&#xff09;的架构&#xff0c;允许开发者“一次编写&#xff0c;到处运行”&#xff08;Write Once, Run Anywhere&…

基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Maven基础简介

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;spring等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; Maven简介 Maven是什么 Maven…

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…

有趣的数学 博弈论初探

1、简述 博弈论是数学的一个分支&#xff0c;专注于分析此类博弈。博弈论可以分为两个主要分支学科&#xff1a;经典博弈论和组合博弈论。经典博弈论研究玩家同时移动、下注或制定策略的游戏。 从数学意义上讲&#xff0c;游戏是指玩家根据定义的规则做出理性决策&#xff0c;试…

js小案例-省市级联

运行效果&#xff1a; 代码演示&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>省市级联</title><style type"text/css">.regist_bg {width: 100%;height: 600px;padding-top: 40px…

四元数(Quaternion)的一些性质

四元数(Quaternion)是用于三维旋转和定向的四部分组成的超复数&#xff0c;超复数简单理解就是比abi这样的复数更复杂的复数&#xff0c;其中abi这样的复数我们也可以叫做二元数&#xff0c;表示复平面的一点&#xff0c;对于熟悉欧拉公式的朋友就知道&#xff0c;也可以看成是…

请编程输出无向无权图各个顶点的度 ← 邻接矩阵存图

【题目描述】 请编程输出无向无权图各个顶点的度。【测试样例示意图】【算法代码】 #include <bits/stdc.h> using namespace std; const int maxn100; int mp[maxn][maxn]; //无向无权图的邻接矩阵 int V,E; //顶点数、边数 int sx,ex; //起点编号、终点编号int main()…

通过Electron打包前端项目为exe

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;爱蹦跶的大A阿 &#x1f525;当前正在更新专栏&#xff1a;《JavaScript保姆级教程》、《VUE》、《Krpano》 ✨ 正文 1、 拉取electron官网上的demo&#xff0c;拉下来之后安装依赖&#xff0c;项目跑起来之后&#xff0c;就…

Python并发编程:非阻塞IO

非阻塞IO&#xff08;non-blocking IO&#xff09; Linux下&#xff0c;可以通过设置socket使其变为non-blocking&#xff0c;当对一个non-blocking socket执行读操作时&#xff0c;流程是这个样子 从图中可以看出&#xff0c;当用户进程发出read操作时&#xff0c;如果kernel…

2024超声波清洗机测评推荐、希亦、苏泊尔、德国综合对比哪个牌子好

清洁眼镜的重要性不言而喻&#xff0c;干净的眼镜不仅可以提供清晰的视野&#xff0c;还可以保护眼睛免受有害物质的侵害。并且现在有非常多的盆骨都是离不开眼镜的&#xff0c;像近视的朋友需要经常佩戴眼镜来配合自己看远处实现&#xff0c;经常爬山的朋友需要墨镜来协助我们…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示

前后端数据交互 书接上文&#xff0c;我们上节课通过前后端数据交互实现了分页查询和单条件搜索分页查询的功能&#xff0c;最后留了个小尾巴&#xff0c;就是把其他两个搜索条件&#xff08;email,address&#xff09;也加进来&#xff0c;实现多条件搜索并分页展示。这节课我…

OWASP Top 10 网络安全10大漏洞——A03:2021-注入

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A03:2021-注入 Injection从第一的位置滑落至第三位置。94% 的应用程序针对某种形式的注入进行了测试&#xff0c;最大发生率为 19%&#xff0c;平均发生率为 3%&a…

Mint_21.3 drawing-area和goocanvas的FB笔记(五)

FreeBASIC SDL图形功能 SDL - Simple DirectMedia Layer 是完整的跨平台系统&#xff0c;有自己的窗口、直接捕获键盘、鼠标和游戏操纵杆的事件&#xff0c;直接操作音频和CDROM&#xff0c;在其surface上可使用gfx, openGL和direct3D绘图。Window3.0时代&#xff0c;各种应用…

11.Node.js入门

一.什么是 Node.js Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端的应用程序 Node.js 作用除了编写后端应用程序&#xff0c;也可以对前端代码进行压缩&#xff0c;转译&#xff0c;…

win11中微软商店如何使用微信支付?microsoft store支付教程

Microsoft Store是由微软公司提供的一个数字分发平台&#xff0c;用于购买和下载Windows操作系统及其相关应用、游戏、音乐、电影、电视节目和其他数字内容。该平台最初是作为Windows 8的一部分引入的&#xff0c;后来也适用于Windows 10和其他Microsoft平台。 以下是Microsof…

ROS——用VirtualBox虚拟一台计算机

打开软件后会出现这个界面&#xff0c;点击新建 然后出现这个界面 名称可以自己任取 &#xff0c;点击文件夹后边的箭头会出现这个界面&#xff0c;点其他可以自己选择虚拟机位置&#xff0c;默认C盘 版本和类型因为我们需要的是 Ubuntu&#xff0c;所以类型选择Linux&#xf…

Neo4j 新手教程 环境安装 基础增删改查 python链接 常用操作 纯新手向

Neo4j安装教程&#x1f680; 目前在学习知识图谱的相关内容&#xff0c;在图数据库中最有名的就是Neo4j,为了降低入门难度&#xff0c;不被网上很多华丽呼哨的Cypher命令吓退&#xff0c;故分享出该文档&#xff0c;为自己手动总结&#xff0c;包括安装环境&#xff0c;增删改查…

LeetCode146题:LRU缓存(python3)

代码思路&#xff1a; Python 默认是用 dict 存储属性的&#xff0c;每次用 . 访问属性都需要查字典。如果声明 slots 就不会创建字典&#xff0c;而是改用指针偏移量直接拿到属性对象。所以即节省了内存&#xff08;没有字典&#xff09;又节省了时间&#xff08;省去查字典的…