[C语言实现]数据结构——手撕顺序栈之我出生就会写一个栈

【数据结构|C语言版】栈和队列 各位小伙伴大家好!上次小编给大家讲解了数据结构中的重要基础:算法效率和复杂度分析,接下来我们讲解一下栈和队列!【知识框架】以上就是小编对栈和队列的讲解。如果觉得小编讲的还可以,还请一键三连。互三必回!持续更新中~! 阅读详情


🥰作者: FlashRider

🌏专栏: 初阶数据结构


目录

栈的前置知识

1.什么是栈?

2.生活中哪些地方有栈的影子?

顺序表实现栈

1.为什么通常采用顺序表实现栈?

2.栈的实现


栈的前置知识

1.什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

总的来说,栈就是一个线性表,只不过只能从栈顶入栈,也只能从栈顶出栈,因此栈有一个非常重要的特性——后进先出(First In Last Out)。

2.生活中哪些地方有栈的影子?

让我们来看看下面这段代码:

void f()
{
    printf("666\n");
}
int main()
{
    printf("777\n");
    f();
    return 0;
}

程序的入口是main函数, 然后执行了printf函数,printf函数结束,然后执行f()函数,在f()函数中执行了第二个printf函数,然后第二个printf函数结束,随后f()函数结束,最后才是main函数结束。

我们可以发现,作为程序入口的main反而是最后结束的,而越后执行的函数越先结束,这就是栈的后进先出特性。所以函数就是利用栈来实现调用的。

 然后printf   f()    main再依次出栈,程序结束。


顺序表实现栈

1.为什么通常采用顺序表实现栈?

我们可以发现,对栈进行插入和删除操作时,永远是在栈顶进行操作,我们把栈顺时针旋转90°,
就变成了只在表尾插入删除的线性表,因为不会大量挪动元素,所以我们选择顺序表实现。

2.栈的实现

头文件 Stack.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int STDataType;
typedef struct Stack
{
    STDataType* a;//存放数据的空间首地址
    int capacity;//当前栈最大容量
    int top;//模拟栈顶指针
}ST;
//初始化栈
void StackInit(ST* ps);
//销毁栈 
void StackDestroy(ST* ps);
//插入
void StackPush(ST* ps, STDataType x);
//弹出 
void StackPop(ST* ps);
//获取栈顶元素
STDataType GetTop(ST* ps);
//获取栈当前元素个数
int StackSize(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);

源文件 Stack.c 

//初始化栈
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = ps->top = 0; 
}
//销毁栈 
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}
//插入
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//判满 
	if(ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		if(tmp == NULL)
		{
			printf("malloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//插入元素 
	ps->a[ps->top++] = x;
}
//弹出 
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}
//获取栈顶元素
STDataType GetTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	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;
}

测试一下写出来的栈是否可用

源文件 test.c

int main()
{
	Stack st;
	StackInit(&st);
	StackPush(&st, 1);	
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);
	while(!StackEmpty(&st))
	{
		printf("%d ", GetTop(&st));
		StackPop(&st);
	}
	return 0;
}

结果:


数据结构 顺序栈的基本操作 c语言代码 sdads 阅读详情

相关推荐

【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结

关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结

小人物,大梦想! 3029

【C++】手撕 栈 & 队列(适配器)

【C++】手撕 栈 & 队列stack   1,stack的介绍   2,stack 框架   3,push(const T& x)   4,pop()   5,top()   6,size()   7,empty()   8,stack 测试   9,源代码 二,queue   1,queue的介绍   2,queue 框架   3,push(const T& x)   4,pop()   5,front()   6,back()   7,

m0_71676870的博客 1481

C语言数据结构-栈的使用及实例

C语言数据结构——栈的使用及实例 本文主要讨论C语言数据结构的又一重要结构——栈 栈的理论知识 定义和特点 定义:只允许在一端插入和删除的线性表;允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。 特点:后进先出 (LIFO) 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 ​使用通俗的话语形容就像压入子弹夹的子弹,先压入

qq_53160758的博客 4402

手撕数据结构---栈和队列的概念以及实现

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)队列中的每一个数据是通过一个节点保存的,节点和节点之间是通过指针链接的,压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。队列的底层是链表,链表是由一个一个的节点组成。⼊队列:进⾏插⼊操作的⼀端称为队尾。出队列:进⾏删除操作的⼀端称为队头。

2301_80863610的博客 3984

c语言 数据结构栈的创建

栈是一种线性数据结构,采用先进后出的方式管理数据其中一段固定,称之为栈底,另一端随着数据进出而随时改变位置,叫做栈顶,用程序实现栈一定要记录栈顶的位置,往栈放入数据操作称之为入栈(压栈),从栈中取出数据的操作称之为出栈(弹栈),可以使用顺序结构来实现栈,这种栈叫顺序栈,也可以使用链式结构来实现栈,这种栈叫链式栈。 下面就是顺序栈的创建步骤和代码实现过程,用的是多文件的形式,我是在Linux系统下编...

lovemingshu的博客 5051

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

qq_63539957的博客 2万+

手撕数据结构之栈

手撕栈(顺序表) 类的说明 创建空斩__init__ 判断是否为空is_empty 压push 出pop 取出压入的元素top class Stack(): def __init__(self): self.item = [] def is_empty(self): return self.item == [] def push(self,elem): self.item.ap...

yangyu11111的博客 290

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

十分钟手撕栈与队列——栈与队列实现详解

十分钟带你一命通关栈与队列 既然选择远方,只顾风雨兼程!

qq_61500888的博客 2971

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 894

LangFuse部署与实践

LangFuse的原理主要是基于可观察性和分析技术来监控和优化低延迟消息(LLM)应用。它提供了一套完整的解决方案,通过收集、处理和分析LLM应用在运行过程中产生的各种数据,来生成实时的、深入的、可操作的见解。通过提供实时的、深入的见解和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。总的来说,LangFuse的原理是通过综合运用可观察性和分析技术,来提供对LLM应用的全面监控和优化能力。这使得开发者和运维团队能够更加高效地管理和维护他们的应用,从而提升用户体验和业务效益。

pumpkin84514的博客 7945

数据结构-栈(C语言代码)

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct.

weixin_50246370的博客 5997

基于AOD-Net与GAN的深度学习去雾算法开发

本文提出一种结合AOD-Net与GAN的深度学习去雾算法。通过改进的AOD-GAN网络架构,集成风格迁移模块,设计包含对抗损失、内容损失和风格损失的复合目标函数。实验表明,该方法在PSNR(24.67)、SSIM(0.92)和FID(32.15)指标上优于传统方法,实现了端到端的物理模型引导图像去雾。未来将优化多尺度特征融合和轻量化部署。

huanghm88的专栏 594

c语言实现栈(顺序栈,链栈)

c语言实现数据结构栈,顺序栈,链栈

@初阶牛的博客 1668

计算图像哈希SHA-512

上述需要将lena.jpg放在当前目录下。

计算机视觉之光 961

42页Claude 3技术报告解读(Opus, Sonnet, Haiku)

在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。

具身机器人和通用AI 2438

数据结构---栈的概念及顺序栈入栈、出栈等操作的实现(C语言)

文章目录🎄栈的基本概念🎄顺序栈及其操作的实现⭐1.顺序栈的初始化⭐2.顺序栈入栈操作⭐3.顺序栈出栈操作⭐4.判断顺序栈是否空⭐5.判断顺序栈是否满⭐6.遍历打印顺序栈中元素⭐7.清空顺序栈中元素⭐8.计算顺序栈元素个数⭐9.动态内存释放 本文中所涉及的完整代码及测试代码等已提交至gitee,可以点击此链接查看参考。 因为本人是编程初学者,文中及代码中难免出现错误,请同志们批评指正! 🎄栈的基本概念 上图是一个羽毛球筒,它只有一端开口,羽毛球在其中挨个存放,如果我们想往里面放入一只羽毛球,只能从

羟基与苯的博客 8826

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

c语言实现顺序栈

顺序栈的基本操作 顺序栈的基本操作包括顺序栈的初始化、判断栈是否为空或者满、清空栈表、进栈、出栈、读取栈顶元素、打印栈表以及求栈表长度等等运算。其中比较重要的有进栈、出栈以及读取栈顶元素。

m0_70885714的博客 6452

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【数据结构】C语言实现顺序栈

【数据结构】第三章——栈、队列和数组 详细介绍通过C语言实现顺序栈

蒙奇D索大的博客 2107

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构之栈(顺序栈和链栈)(c语言附完整代码)

① 栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素的操作。② 进行数据插入的删除和操作的一端,称为栈顶,另一端则称为栈底。③ 栈中的元素遵守后进先出的原则,即 LIFO原则(Last In First Out)栈也称为后进先出表。④栈的插入操作通常称为进栈或者入栈,栈的删除操作通常称为出栈或退栈。示意图:栈的顺序存储结构称为顺序栈声明顺序栈int top;//栈指针 } SqStack;栈的链式存储结构称为链栈声明链栈。

m0_62795460的博客 5843

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言实现顺序栈

C语言实现顺序栈常规操作

qq_43629857的博客 1万+

【数据结构】顺序栈

顺序栈

2203_76003626的博客 2574

数据结构 用C语言实现顺序栈的入栈,出栈,判断栈空

顺序栈,遵循先进后出后进先出原则。我在写的时候,宏定义的 firstsize 为创建一个栈时这个栈的初始大小,这里为100。addsize 为当栈满时,再想入栈的话每次栈大小的增量,这里用10来代替。 create函数为创建栈函数。push为入栈函数。empty函数用来判断 栈是否为空,print函数用来出栈。 //以下为全部代码 #include "stdio.h" #include "mall...

weixin_44917617的博客 7395

C语言实现顺序栈和链栈

C语言实现顺序栈和链栈 重温数据结构主要知识点,本文章主要介绍栈,用个人的理解写下思路和代码。 文章目录C语言实现顺序栈和链栈前言一、顺序栈1. 栈的主要函数2.C语言实现二、使用步骤1.引入库2.读入数据总结 前言 栈的思想很重要很重要,对大数据算法,加密算法,机器学习甚至在生活中都有很大的帮助。 提示:以下是本篇文章正文内容,下面案例可供参考 一、顺序栈 顺序栈:利用顺序表(即我们通常说的数组)实现数据存储。 1. 栈的主要函数 栈的数据结构体包括:栈底指针变量,栈顶指针变量,数据存储变量(数

小谷的博客 1672

【数据结构】C语言实现顺序栈(附完整运行代码)

使用C语言实现顺序栈程序的新手入门详解.包括每个函数的设计思路及程序的完整代码.

C/C++领域,数据结构,linux,MySQl学习者 4724
上一篇: [C语言实现]带你手撕带头循环双链表
下一篇: [C语言实现]数据结构之《关于我转生成队列这档事》
FlashRider
博客等级 码龄4年 529粉丝 24原创
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值