当前位置: 首页 > news >正文

24.8.5数据结构|栈

栈-弹夹

1、定义:

栈就是特殊的线性表,与之前的线性表的区别就是增加了约束,只允许在一端插入和删除,就这麽简单。

2、基本操作

栈的插入操作叫:入栈{进栈、压栈};栈的删除:出栈{退栈,弹栈}

课本要求:

0、定义结构

//定义结构
#define Maxsize 100;//存储空间的初始分配量 
typedef int Element;
typedef struct{int top;Element *date;int size; 	
}StackList; //#define Maxsize 100
//typedef int Element;
//typedef struct{
//	int top;
//	Element date[Ma];	 	
//}StackList; 

1、初始化initstack:作用是初始化一个空战

2、求栈长getlen(S):返回站的元素个数

3、取栈顶元素gettop(S,x):通过x带回栈S的栈顶元素的值

4、入栈操作push(S,x),将x元素压入到站s中,使x成为新的栈顶元素

5、出栈操作pop(S,x):将非空栈的栈顶元素删除

6、判栈空操作emptystack(S),为空,返回1,否则返回0.

7、输出栈操作showlist(S):以此输出栈S中的所有元素

3、理解

基本概念

1、栈顶指针(top):记录当前栈顶的位置(下标或指针),元素的个数,站的长度

2、课本默认,空栈递减,栈顶指针初始化为0.【使用了0为栈空标记可以理解为赋值再++

3、所以,满递增栈【使用-1作为栈空标志】可以理解为直接top++再赋值

 

1、栈顶指针初始化为0或-1的区别: 
感谢我AI哥:
栈顶指针初始化为0或-1的区别
栈顶指针是用来指示栈中当前顶部元素位置的变量。在不同的编程实践中,栈顶指针的初始化值可以是0或-1,这两种做法反映了不同的设计哲学和操作习惯。栈顶指针初始化为-1
设计哲学:当栈顶指针初始化为-1时,它表示栈是空的,因为在数组中,-1不是一个有效的索引值。这样,当栈为空时,栈顶指针指向的是一个非法的位置,从而直观地表达了“没有元素在栈中”的状态。
操作习惯:在压栈操作(push operation)中,首先将栈顶指针加1,然后将新元素放入栈顶指针所指向的位置。在出栈操作(pop operation)中,首先取得栈顶元素的值,然后将栈顶指针减1。这种做法在逻辑上类似于“先预留空位,再放置元素”。栈顶指针初始化为0
设计哲学:当栈顶指针初始化为0时,它表示栈的底部,因为在数组中,0是第一个有效的索引值。这样,当栈为空时,栈顶指针正好位于栈底,表示栈中没有元素。
操作习惯:在压栈操作中,首先将新元素放入栈顶指针所指向的位置,然后栈顶指针加1。在出栈操作中,首先将栈顶指针减1,然后取得栈顶元素的值。这种做法在逻辑上类似于“先放置元素,再移动指针”。何时使用哪种初始化方式
选择栈顶指针初始化为-1还是0取决于个人偏好和具体应用场景。如果设计者倾向于直观地表达“空栈”的概念,并且喜欢在压栈前预留空位的操作方式,可能会选择初始化为-1。相反,如果设计者认为栈顶指针直接指向栈底更为直观,并且喜欢在压栈时直接放置元素的操作方式,可能会选择初始化为0。
2、realloc和malloc的区别

 

3、堆上提供长效空间,栈上生命周期短(临时使用)

顺序栈:固定大小

堆上维护接口

申请();

释放(Arraystack*stack);

满递增栈

入栈(,);

出栈();

#include<stdio.h>
#include<stdlib.h>//定义结构
#define Maxsize 100//存储空间的初始分配量 
typedef int Element;
typedef struct{int top;Element *date;int size;
}StackList; 
//第二种方法 
//#define Maxsize 100
//typedef int Element;
//typedef struct{
//	int top;
//	Element date[Ma];	 	
//}StackList; 
//都利用了数组 //初始化initstack:作用是初始化一个空战
void initstack(StackList*stack){stack->date=(Element*)malloc(sizeof(Element)*Maxsize);//这里给数据申请的空间 stack->top=0;//2、课本默认,空栈递减,栈顶指针初始化为0.【0为栈空标记】stack->size=Maxsize;}
//StackList*Createstack(StackList*stack) {
//	stack=(StackList*)malloc(sizeof(StackList)*Maxsize);
//	for(int i=0;i<Maxsize;i++){
//		stack->date[i]=0;
//	}
//	stack->top=-1;
//	return stack;
//}//2、求栈长getlen(S):返回站的元素个数
int getlen(StackList*list){return list->top;
}//3、取栈顶元素gettop(S,x):通过x带回栈S的栈顶元素的值
int  gettop(StackList*S,Element *x){//考虑栈空if(S->top==0)return 0;*x=S->date[S->top-1]; //为什么减一?取原来已经有的元素 return 1;
}// 4、入栈操作push(S,x),将x元素压入到站s中,使x成为新的栈顶元素
int  push(StackList*stack,Element x){//考虑栈满 ,栈满扩容 if(stack->top>=Maxsize) {stack->date=(Element*)realloc(stack->date,(Maxsize+1)*sizeof(Element));//ralloc的用法 if(!stack->date)return 0;//考虑空间分配不成功,返回0 stack->size++;} stack-> date[stack->top++]=x;return 1;
}
// 5、出栈操作pop(S,x):将非空栈的栈顶元素删除,存入指针e'所指向的内存单元 
int pop(StackList*stack,Element*x){//if(stack->top==0)return 0;*x=stack->date[--stack->top];return 1;
}//6、判栈空操作emptystack(S),为空,返回1,否则返回0.
int emptystack(StackList*stack){if(stack->top==0)return 1;return 0;
}
//7、输出栈操作showlist(S):以此输出栈S中的所有元素
void showLlist(StackList*stack){while(stack->top!=0){printf("%d",stack->date[--stack->top]);}
}

链式栈

相关文章:

24.8.5数据结构|栈

栈-弹夹 1、定义&#xff1a; 栈就是特殊的线性表&#xff0c;与之前的线性表的区别就是增加了约束&#xff0c;只允许在一端插入和删除&#xff0c;就这麽简单。 2、基本操作 栈的插入操作叫&#xff1a;入栈{进栈、压栈}&#xff1b;栈的删除&#xff1a;出栈{退栈&#x…...

LeetCode算法题训练

力扣刷题训练 开始记录力扣的刷题之路 刷题思路来自灵茶山艾府 入门题单&#xff1a; 「新」动计划 编程入门编程基础 0 到 1 训练方法 A 滑动窗口&#xff08;定长/不定长/多指针&#xff09;二分算法&#xff08;二分答案/最小化最大值/最大化最小值/第K小&#xff09…...

Python | Leetcode Python题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0...

手机CPU性能天梯图(2024年8月),含安兔兔/GB6/3DMark跑分

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月手机处理器天梯图 2024年8月1日更新日志&#xff1a;由于近期并未有新处理器发布&#xff0c;故只做常规更新&#xff1b;移除鲁大师天梯图&#xff1b;补充其它天梯图数量。 -…...

通过实际的例子和代码演示,可以更好地理解 `optional` 的使用方式和应用场景

当然&#xff0c;让我们通过一些实际的例子来演示 std::optional 的使用方式和应用场景。 场景 1&#xff1a;函数返回值 假设我们有一个函数&#xff0c;它尝试从字符串中解析一个整数&#xff0c;但如果字符串不是一个有效的整数&#xff0c;我们希望返回一个错误状态。 #…...

Java 电商秒杀系统优化实战:实现进阶示例详解与 RabbitMQ 配置

上一篇博客介绍了使用消息队列、异步处理等技术构建 Java 电商秒杀系统的基本思路&#xff0c;本文将进一步优化代码实现&#xff0c;并提供更详细的代码示例和 RabbitMQ 配置&#xff0c;助您构建更健壮、高效的秒杀系统。 一、 代码优化 1. 接口限流 在 SeckillController…...

路径规划 | 基于狼群算法的无人机路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于狼群算法的无人机路径规划&#xff08;Matlab&#xff09; 狼是一种群居性动物&#xff0c;社会分工明确&#xff0c;通过承担各自的责任与团结协作&#xff0c;共同促进整个狼群的生存与发展。狼群算…...

13-python函数返回值和装包的后续提取数据方法——解包

1.1 参数解包 不定长参数简单来讲就是装包&#xff0c;把多个参数装到一个元组或者装到字典中&#xff0c;就叫做装包 Ctrld可以快速向下复制 传递实参时&#xff0c;也可以在序列类型的参数前添加星号&#xff0c;这样他会自动将序列中的元素依次作为参数传递 注意&#x…...

I. 对线

https://codeforces.com/gym/103186/problem/I 一开始感觉操作挺复杂的 但是写过Chino的数列 - 洛谷 发现可以通过矩阵来实现swap操作&#xff0c;就想能不能用线段树维护矩阵来写 有三排兵线&#xff0c;我们维护区间和&#xff0c;因此初始矩阵就有了 接下来分析每个操作的…...

Topsis法模型(评价类问题)

目录 本文章内容参考&#xff1a; 一. 概念 二. 特点和适用范围 三. 实现步骤 四. 代码实现 本文章内容参考&#xff1a; TOPSIS法模型讲解(附matlab和python代码) 【数学建模快速入门】数模加油站 江北_哔哩哔哩_bilibili 一. 概念 TOPSIS&#xff08;Technique for O…...

HPA 与pod调度

HPA 自动更新工作负载资源&#xff08;例如 Deployment 或者 StatefulSet&#xff09;&#xff0c; 目的是自动扩缩工作负载以满足需求。 绑定到deploy上&#xff0c;控制pod 依托于metrics-server HorizontalPodAutoscaler 水平pod自动扩缩&#xff1a;意味着对增加的负…...

jupyter下载

https://blog.csdn.net/qq_48372575/article/details/125630622 我下面是CPU运行的&#xff0c;GPU链接在上面 Anaconda下载 https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 参考链接&#xff1a; https://blog.csdn.net/qq_48372575/article/detai…...

蓝桥杯双周赛 第 16 场 小白入门赛 解题报告 | 珂学家 | 七夕娱乐场

前言 题解 因为这场七夕节&#xff0c;所以出的特别友好。 整体还是偏思维。 T6 额外提供组合数学解&#xff0c;还是蛮有趣的。 A. 喜鹊罢工 题型: 签到 365 可以有多少个 7 组成 365可以有多少个7组成 365可以有多少个7组成 向上取整即可 #include <iostream>usi…...

[C++] 深入理解面向对象编程特性 : 继承

文章目录 继承的概念与定义继承的定义定义格式不同继承方式与继承的基类中访问限定符间的影响C中的继承和访问控制总结父类的private成员在子类中的访问限制protected成员的使用场景成员访问方式总结继承方式的默认值实际应用中的继承方式 示例代码 OOP中类之间的关系“is a” …...

汇昌联信科技做拼多多电商怎么引流?

在互联网经济高速发展的今天&#xff0c;电商平台如雨后春笋般涌现&#xff0c;其中拼多多以其独特的社交电商模式迅速崛起。对于汇昌联信科技而言&#xff0c;如何在拼多多平台上有效引流&#xff0c;成为提升销量和品牌知名度的关键。本文将深入探讨汇昌联信科技在拼多多电商…...

公网ip和私网ip的区别

1.接入方式不同\n公网IP以公网连接Internet上的非保留地址&#xff0c;私网IP则是局域网上的IP&#xff0c;通过NAT才能够与公网进行通信。 2.特点不同\n公网IP由国际互联网络信息中心InterNIC负责,将IP地址分配给注册并向InterNIC提出申请的机构或组织。私网IP则是为节省可分…...

【开发踩坑】windows查看jvm gc信息

windows查看jvm gc信息 EZ 找出java进程PID 控制面板----搜索任务管理器---- 任务管理器----搜索 java----详细信息 这里PID是4856 cmd jstat gc面板 reference&#xff1a; jstat命令...

时间序列预测 | CEEMDAN+CNN+Transformer多变量时间序列预测(Python)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时间序列预测 | CEEMDANCNNTransformer多变量时间序列预测&#xff08;Python&#xff09; 时间序列预测 创新点 多尺度特征提取&#xff1a;CEEMDAN将复杂的时间序列分解成多个IMFs&#xff0c;使得CNN和Transforme…...

vue3--实现vue2插件JSONPathPicker的路径获取功能

背景 最近在进行vue2项目升级为vue3。 在项目中需要获取json某些字段的路径&#xff0c;vue2中使用JSONPathPicker &#xff0c;但是该插件不支持vue3&#xff0c;vue3中也没有相应的模块有该功能。 实现目标&#xff1a; 原vue2中JSONPathPicker实现的功能&#xff1a; 查…...

SuccBI+低代码文档中心 — 可视化分析(仪表板)(上)

有关仪表板的设计器&#xff1a; 查询设置 由于仪表板的设计器是所见即所得的&#xff0c;可以将当前制作的内容和数据的查询结果实时展示在界面中&#xff0c;当引入到仪表板的模型数据量较大时&#xff0c;为了提高设计器界面的查询性能&#xff0c;提供了以下两种方法&…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

Axure零基础跟我学:展开与收回

亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...