【数据结构】-- 栈

引入:

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

注意:入栈顺序是DCBA,出栈顺序不一定是ABCD,可以边入边出

所以,入栈顺序是DCBA ,出栈顺序有很多种。

栈的实现:

数组,单向链表,双向链表都能够实现栈:

数组:

单链表:

用单链表实现栈有一个问题,单链表不能回头,如图这么设计,在压栈之后,不方便出栈。

所以我们可以以开头作为栈顶,然后对链表头插来实现栈,出栈的时候使用头删。

双向链表:

 双向链表可以通过前一个元素直接访问上一个元素,这使得在双向链表中实现栈的出栈功能更加高效和方便。因为双向链表可以从尾部直接访问到最后一个元素,从而实现了栈的后进先出(LIFO)特性。

由于CPU的高速缓存,在这里我们使用数组来实现栈 。

头文件:

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.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);//判断栈里面有多少中数据(数据个数)

实现文件:

初始化栈的时候可以开辟空间也可以后面再开辟,在初始化top的时候有两种写法。

把top初始化为0:
这时,top指向栈顶元素的下一位

把top初始化-1:

这时,top指向栈顶元素。

不必过分在意top,无论top指向哪里,top只是一个数字,数据依然从栈顶开始存储。只不过,第一种方法有了第一个数据的时候top的值是1,第二种方法有了第一个数据时top的值为0。

在这里我们选择第一种写法。

#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"
//初始化
void STInit(ST* pst)
{assert(pst);pst->a = NULL;//top指向栈顶数据的下一个位置pst->capacity = 0;pst->top = 0;//top指向栈顶数据//pst->top = -1;}
//销毁
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, newcapacity * sizeof(STDataType));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);pst->top--;
}
//获取栈顶的元素
STDataType STTop(ST* pst)
{assert(pst);return pst->a[pst->top - 1];
}
//判断栈是否为空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;}
//判断栈里面有多少中数据(数据个数)int STSize(ST* pst)
{assert(pst);return pst->top;
}

 测试文件:

#define _CRT_SECURE_NO_WARNINGS 1#include"Stack.h"int main()
{ST s;STInit(&s);STPush(&s, 1);STPush(&s, 2);STPush(&s, 3);STPush(&s, 4);printf("%d \n", STTop(&s));//列出栈中元素while (!STEmpty(&s)){printf("%d ", STTop(&s));STPop(&s);}return 0;
}

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

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

相关文章

04--SpringBoot热部署与日志

1、热部署 1.1 引言 为了进一步提高开发效率&#xff0c;SpringBoot为我们提供了全部项目热部署&#xff0c;日后在开发过程中修改了部分代码或者相关配置文件之后&#xff0c;不需要再重启服务使其生效。在项目中开启了全局热部署之后&#xff0c;只需要在修改之后等待几秒钟…

Python内置数据类型详解:从基础到进阶

Python内置数据类型详解:从基础到进阶 在Python编程中,数据类型是构建程序的基础。Python提供了多种内置数据类型,用于存储不同类型的数据。这些数据类型不仅易于使用,而且功能强大,能够满足各种编程需求。本文将详细介绍Python中的内置数据类型,包括它们的特点、用法以…

ARM GIC 和NVIC的区别

ARM GIC&#xff08;Generic Interrupt Controller&#xff09;和NVIC&#xff08;Nested Vectored Interrupt Controller&#xff09;是两种不同的中断控制器&#xff0c;它们在ARM架构中扮演着重要的角色&#xff0c;但各自有不同的设计和应用场景。 ARM GIC&#xff1a; G…

广东省保健食品行业协会批复成为“世界酒中国菜”活动指导单位

广东省保健食品行业协会正式批复成为“世界酒中国菜”系列活动指导单位&#xff0c;共促餐饮文化交流发展 近日&#xff0c;广东省保健食品行业协会正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位…

a+bi vs a+bj, Mathematics vs. Engineering.

In Python (and many other programming languages), the use of “j” instead of “i” for representing the imaginary unit in complex numbers is a convention borrowed from electrical engineering and physics. Let me explain why: Historical Context: The use of …

填补领域空白!TerDiT:首次探索大规模DiT模型量化问题(MMLab出品)

论文链接&#xff1a;https://arxiv.org/pdf/2405.14854 项目链接&#xff1a;https://github.com/Lucky-Lance/TerDiT 最近在大规模预训练的文本到图像扩散模型方面的发展显著提高了高保真图像的生成能力&#xff0c;特别是基于transformer架构的扩散模型&#xff08;DiTs&a…

奈飞CEO最新访谈:抢走你饭碗的不是AI,而是能熟练使用AI的人

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

新书推荐:7.5 goto、break、continue语句

本节必须掌握的知识点&#xff1a; 示例二十六 代码分析 汇编解析 示例二十七 代码分析 汇编解析 7.5.1 示例二十六 ■goto语句&#xff1a;无条件转移语句。 语法格式&#xff1a; goto label; label : 代码; ●语法解析&#xff1a; 执行到goto语句时&#xff0c;则无…

算法提高之64位整数乘法

算法提高之64位整数乘法 核心思想&#xff1a;位运算 和快速幂相似 预处理1*a 2*a 4*a …的值 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;LL qadd(LL a,LL b,LL p){LL res 0;while(b){if(b &…

Jetpack架构组件_1.基本知识

1.什么是Jetpack&#xff1f; Jetpack 是一个由多个库组成的套件&#xff0c;可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码&#xff0c;让开发者可将精力集中于真正重要的编码工作。Jetpack 包含一系列 Android 库&#xff0c;它…

js Dom基础

获取元素 1、getElementById() 通过id属性获取一个元素节点对象 <div id"div1"></div> <script> var div1 document.getElementById(div1) </script> 2、 getElementsByTagName()可以根据标签名来获取一组元素节点对象 这个方法会给我们返…

pcdn服务器应该怎么配?

要配置PCDN&#xff08;Private Content Delivery Network&#xff09;服务器&#xff0c;可以按照以下步骤进行&#xff1a; 需求分析&#xff1a;明确业务需求&#xff0c;确定所需的CDN功能和性能参数。这包括预期的流量、负载、内容类型、目标用户群体等。 硬件选择&#…

VCRUNTIME140_1.dll丢失是怎么回事?vcruntime140_1.dll无法继续执行代码的处理方法

VCRUNTIME140_1.dll丢失是怎么回事&#xff1f;问出这样的问题的人&#xff0c;一般是遇到vcruntime140_1.dll无法继续执行代码的问题了&#xff0c;找不到VCRUNTIME140_1.dll文件&#xff0c;那么程序就肯定是启动不了的&#xff0c;程序的启动是需要VCRUNTIME140_1.dll文件的…

Java进阶学习笔记1——课程介绍

课程适合学习的人员&#xff1a; 1&#xff09;具备一定java基础的人员&#xff1b; 2&#xff09;想深刻体会Java编程思想&#xff0c;成为大牛的人员&#xff1b; 学完有什么收获&#xff1f; 1&#xff09;掌握完整的Java基础技术体系&#xff1b; 2&#xff09;极强的编…

git常用命令使用

1 查看分支 git branch 查看本地分支&#xff08;*号绿色高亮就是所在分支&#xff09;git branch -a 查看远程分支 2 分支常用命令 git branch xxx&#xff1a;新建分支git checkout xxx&#xff1a;切换分支git checkout -b xxx&#xff1a;新建分支并切换到该分支&#x…

可执行文件以及其加载过程

在计算机系统中&#xff0c;可执行文件是指包含机器代码的文件&#xff0c;计算机可以直接执行这些代码以运行特定的任务或程序。不同的操作系统对可执行文件有不同的定义和处理方式。本文将探讨常见操作系统中的可执行文件格式及其加载过程&#xff0c;特别是以ELF&#xff08…

行为设计模式之状态模式

文章目录 概述定义结构图 2.代码示例小结 概述 定义 状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为。 对象看起来似乎修改了它的类。 状态模式就是用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.。状态模式将一个对象的状态…

Apache Doris 2.1.3 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.3 版本已于 2024 年 5 月 20 日正式发布。该版本在功能特性上对数据湖、物化视图、负载管理等方面进行了多项更新&#xff0c;进一步简化湖仓一体架构、加速了查询性能&#xff1b;同时提交了若干改进项以及问题修复&#xff0…

简单的网页分享按钮代码

创建一个网页分享按钮通常涉及到HTML、CSS和JavaScript的组合使用。下面是一个简单的示例代码&#xff0c;展示了如何创建一个包含微博、QQ和QQ空间分享的按钮。请注意&#xff0c;这只是一个前端的实现示例&#xff0c;实际分享功能需要依赖于相应的社交媒体平台提供的API或分…

Flutter 中的 CompositedTransformFollower 小部件:全面指南

Flutter 中的 CompositedTransformFollower 小部件&#xff1a;全面指南 在Flutter的动画和视觉效果世界中&#xff0c;CompositedTransformFollower是一个高级组件&#xff0c;它允许开发者创建复杂的跟随动画。这个小部件通常用于实现视差效果或者当一个组件需要跟随另一个组…