栈与队列(栈)

栈知识点总结(一):使用数组和链表实现栈 前言 栈是一种只能在一端进行插入或删除的线性数据结构,栈的主要特点是后进先出(Last In First Out, FIFO),即后进栈的元素先出栈。栈的应用很广泛,常见的应用场景例如表达式的括号匹配、文本编辑器的撤销功能、以及一些需要将有序数据逆序的场景都需要用到栈。栈的实现较为简单,并且可以由两种数据结构:链表、数组来实现,这篇文章要讲的就是如何用数组和链表来实现一个栈,同时简单讲讲两种实现... 阅读详情

栈

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

1.2栈的动图理解
S1 S2 S3 S4 S5 S6 依次入栈
出栈顺序:S2 S3 S4 S6 S5 S1
在这里插入图片描述
栈 其实很形象的可以理解成为 弹夹 “ 后压进去的子弹先被打出去”。
请添加图片描述

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
在这里插入图片描述
我们主要实现下面的支持动态增长的栈
Stack.h

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
//初始化
void InitStack(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);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void InitStack(ST* ps)
{
	assert(ps);
	ps->a = (STDataType*)malloc(4 * sizeof(STDataType));
	if (ps->a == NULL)
	{
		printf("malloc is fail\n");
		exit(-1);
	}
	ps->capacity = 4;
	ps->top = 0;
}

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

void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	assert(ps->a);
	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, 2 * ps->capacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			printf("malloc is fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->a);
	if (ps->a > 0)
	{
		ps->top--;
	}
}

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->a);
	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;
}

main.c`

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
int main()
{
	ST Stack;
	InitStack(&Stack);
	StackPush(&Stack, 1);
	StackPush(&Stack, 2);
	StackPush(&Stack, 3);
	printf("%d ",StackTop(&Stack));
	StackPop(&Stack);
	printf("%d ", StackTop(&Stack));
	StackPop(&Stack);
	printf("%d ", StackTop(&Stack));
	StackPop(&Stack);
	StackPush(&Stack, 4);
	StackPush(&Stack, 5);
	StackPush(&Stack, 6);
	printf("%d ", StackTop(&Stack));
	StackPop(&Stack);
	printf("%d ", StackTop(&Stack));
	StackPop(&Stack);
	printf("%d ", StackTop(&Stack));
	StackDestory(&Stack);
	return 0;
}

1 2 3依次入栈,然后出栈,出栈结果为 3 2 1,然后4 5 6依次进栈,接着出栈,结果为3 2 1 6 5 4.
在这里插入图片描述

3DMax马克杯制作教程 01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ... 阅读详情

相关推荐

EtherCAT APWR报文实战:从站地址配置(0x0010)的初始化流程与报文解析

本文详细解析了EtherCAT APWR报文在从站地址配置(0x0010寄存器)中的初始化流程与实战应用。通过类比物业分配门牌号,生动解释了APWR报文如何高效批量配置从站地址,并深入探讨了0x0010寄存器的特殊作用、初始化步骤及常见问题排查方法。文章结合IgH主站的三从站配置案例,提供了报文解析技巧和调试建议,帮助工程师快速掌握EtherCAT网络配置的核心技术。

weixin_28744423的博客 410

【数据结构】用队列实现栈

本篇总结利用队列如何实现栈的相关操作,不难观察,栈和队列是可以相互转化的,需要好好总结它们的特性,构造出一个恰当的结构来实现即可,所以本篇难点不在代码思维,而是对结构的理解。

Extreme_wei的博客 4298

CUPED (Controlled-experiment using Pre-Experiment Data) 论文学习笔记

CUPED是一种用于提升A/B测试灵敏度的方差缩减技术。它通过利用实验前用户行为数据(协变量X)构建调整后的指标Y_cuped=Y-θ(X-E[X]),其中θ=Cov(Y,X)/Var(X)。这种方法能在保持处理效应估计无偏的前提下,将方差降低1-ρ²倍(ρ为前后指标相关性)。CUPED的核心优势在于:不改变平均处理效应的估计,但能显著提升统计功效,使得实验更容易检测到微小但真实的效应,同时减少所需样本量或实验周期。该技术特别适用于用户异质性大、指标方差高的场景。

pursuit的博客 2144

java 栈和队列实现迷宫代码_队列实现栈的3种方法,全都击败了100%的用户!

本文已收录至 Github《小白学算法》系列:https://github.com/vipstone/algorith之前我们讲过《用两个栈实现一个队列》,而今天我们要讲的是「用队列实现栈」,它们都属于常见的面试题,而我们今天要用多种方法来实现队列到栈的“转变”。老规矩,先来回顾一下栈(Stack)和队列(Queue)的特性和常见方法。栈是后进先出(LIFO)的数据结构,常见方法如下:push(...

weixin_39946460的博客 407

pytorch gpu运行安装重点(CUDA12.3)

pytorch gpu加速

weixin_45597212的博客 3万+

unet学习笔记(milesial/Pytorch-UNet)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 unet学习笔记(milesial/Pytorch-UNet)原理讲解unet_parts.py内容predict.py内容 所用到的代码Pytorch-UNet/predict.py at master · milesial/Pytorch-UNet ·GitHub 原理讲解 蓝/白色框表示 feature map; 蓝色箭头表示 3x3 卷积,用于特征提取; 灰色箭头表示skip-connection,用于特征融合; 红色箭头.

weixin_67138138的博客 2553

队列实现栈

队列实现栈,多理解几遍,多些几遍也就会了。

adcxhw的博客 2179

【Microchip】微芯 MPLAB® X IDE开发环境新建项目(点亮1颗LED灯)(常用右键菜单快捷键)

1.新建项目2. 选择芯片型号和调试器3.选择编译器4.项目命名和选择文件路径5.新建成功,给项目添加main.c7.将新建的mainXC16.c文件添加进项目6000000UL这三个就是。

Naiva的博客 449

【数据结构与算法】用队列实现栈

😼前面我们相继实现了栈和队列,是不是愁没有练手的地方呢?别担心,本章带大家用队列来实现一个栈!😽我们都知道,栈和队列可以看作为兄弟,一个后进先出(LIFO),一个先进先出(FIFO),他们虽有不同的性质,但总的来说还是不分家的,因为,我们既可以用队列实现栈,也可以用栈实现队列,而本章就先来带大家来了解如何使用队列来实现栈。💝学会了用队列实现栈,那么下一篇文章就是教大家如何用栈实现队列了。栈和队列还真是有趣呢!❤️‍🔥后续将会持续输出有关数据结构的文章,你们的支持就是我写作的最大动力!

Welcome home | Jian Liao 's blog 2299

智能车图像处理16-进阶篇8--右环岛状态机与补线

这篇文章主要讲述智能车竞赛中如何判断右环岛并且进行状态补线。

taiyuezyh的博客 1万+

2025年最新自动化/控制保研夏令营&预推免面试真题分享(东南/浙大/华科清华)

笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题。

Control Everything 2646

栈与队列的学习总结

栈与队列1、栈1.1栈的定义1.2栈的存储结构及实现1.2.1栈的顺序存储1.2.2栈的链式存储1.3两栈共享存储空间1.4 栈的应用(四则运算表达式求值)2、队列2.1 队列的定义2.2循环队列2.3队列的链式存储结构及实现3、栈与队列的比较 1、栈 1.1栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表 1.2栈的存储结构及实现 1.2.1栈的顺序存储 1.2.2栈的链式存储 1.3两栈共...

奔跑的蜗牛 6226

23、OpenMP常见用例与标准循环级示例详解

本文详细介绍了OpenMP的三种典型用例:循环级OpenMP、高级OpenMP和MPI+OpenMP,适用于不同层次的并行需求。重点讲解了循环级OpenMP在向量加法、流三元组和模板计算中的应用示例,并探讨了首次触摸优化、线程绑定、NUMA架构影响等关键性能优化策略。通过实际代码演示和性能分析,帮助开发者快速掌握OpenMP的基础并行化方法,并为后续高性能优化提供指导。

fanta的博客 86

小论栈与队列

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构递归是一种重要的程序设计方法。简单地说,若在一个函数、过程或数据结构的定义中又应用了它自身,则这个函数、过程或数据结构称为是递归定义的,简称递归。

Liuyuanxiao123的博客 2090

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【算法系列-栈与队列】栈与队列的双向模拟

欢迎来到【算法系列】第五弹 🏆 栈与队列,接下来我们将围绕栈与队列这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨

Mwt258的博客 938

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

栈与队列学习总结

栈与队列学习总结 栈 结构特点:后进者先出,先进者后出,同时栈是一种“操作受限”的线性表,只允许在一端插入和删除数据 栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。 时间空间复杂度分析 在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)。 不管是顺序栈还是链式栈,入栈、出栈只涉及栈顶个别数据的操作,所以时间复杂度都是 O(1)。 特殊情况: 对于出栈操作来说,不会涉及内存的重新申请和数据的搬移,所以出.

guoquanqin的博客 6560

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

栈与队列及部分题目

栈和队列相比于线性表其实并没有新的内容,只是此时对这个线性表能进行的操作有所限制而已。

haoloved的博客 1132

栈 与 队列

栈是一种仅允许在固定一端进行插入和删除操作的线性表,该操作端被称为栈顶,另一端则为栈底。其最核心的特性是后进先出(LIFO,Last In First Out)—— 最后进入栈的元素,会成为第一个被弹出的元素。压栈(入栈):栈的插入操作,始终在栈顶执行,新元素入栈后会成为新的栈顶,栈内元素个数随之增加。出栈:栈的删除操作,同样在栈顶执行,栈顶元素弹出后,其下方的元素会成为新的栈顶,栈内元素个数减少。举个直观例子:若依次将 1、2、3、4 压栈,栈内元素从栈底到栈顶的顺序为 [1,2,3,4];

THGML的博客 986

栈与队列算法题

栈与队列相关算法题

原来是猿的成长足迹 848

数据结构之栈与队列

栈,队列的实现及一些简单应用

2301_80001343的博客 1211

栈与队列的异同

栈与队列的异同 二者的相同点: 1.他们都属于线性表。 2.线性表的特点是数据元素之间存在“一对一”的关系,栈和队列都是操作受限制的线性表。 3.都只能在线性表的端点插入和删除 不同之处: 栈(Stack)是只允许在表的尾端进行插入或删除,(在栈中就是“栈顶”),其最大的特点是“先进后出或后进的先出”,可以类比为弹夹中压子弹,最后压的子弹却是最先射出的。 队列(Queue)是只允许在表尾进行插入...

Guo_ping'blog 7647

栈与队列必刷题

括号匹配问题。 题目:. 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例: 例1: 输入:s = “()[]{}” 输出:true 例2: 输入:s = “([)]” 输出:false 思路: 1.判断字符串长度,如果字符串为空则返回true,字符串长度为1则返回false。 2.new一个栈,如果为左括号如: ‘ ( ’ ,’ { ‘,’ [ '.则依次入栈,.

weixin_50910403的博客 462

C语言实现栈与队列

不直接定义一个数组,而采用realloc、malloc来动态管理顺序表大小,使栈的大小不再受限。再定义一个top栈顶指针来方便后续的增删操作。//将int类型重定义叫做MyDataType//一个MyDataType类型的指针,可以进行动态内存开辟//栈的最大容量int top;//用于栈顶指针}ST;队列是只允许在一端插入元素,另一端删除元素的线性表,特点是先进先出。Queue这个结构体中还包含两个QNode结点结构体。包含队列头尾结点,能够帮助从队尾插入和从队头删除。

2301_79432671的博客 1149

初阶3 栈与队列

本章主要讲解了栈和队列两种数据结构的概念、特性及实现方式。栈遵循后进先出(LIFO)原则,支持压栈和出栈操作,可用数组或链表实现;队列遵循先进先出(FIFO)原则,支持入队和出队操作,更适合用链表实现。文中通过选择题展示了栈的出栈顺序特点,并详细给出了动态栈和链式队列的代码实现,包括初始化、销毁、入栈/入队、出栈/出队等核心操作。两种数据结构在计算机科学中应用广泛,理解其实现原理对解决算法问题具有重要意义。

ydm_ymz的博客 1711

栈与队列

1 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈是一个线性表,栈元素具有线性关系,即前驱后继关系,栈的表尾是指栈顶,而不是栈底。栈底是固定的,最先进栈的只能在栈底,栈的插入操作,叫作进栈,栈的删除操作,叫作出栈。 2 ...

mozhan的专栏 333

栈与队列总结篇

在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。使用抽象程度越高的语言,越容易忽视其底层实现,而C++相对来说是比较接近底层的语言。我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。

gyjllll的博客 961
上一篇: 【环形链表】
下一篇: 【堆排序算法】(C语言实现)
桑榆非晚ᴷ
博客等级 码龄5年 2246粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桑榆非晚ᴷ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值