005——栈

news2024/9/23 23:57:38

目录

栈的定义

栈的性质

栈的应用场景

存储结构:

Ⅰ)采用顺序存储结构实现——顺序栈

Ⅱ)采用链式存储结构实现——链栈-->基于单链表(带头结点)


栈的定义

之允许在一端进行插入和删除的线性表

栈的定义

栈的性质

先进后出

栈的应用场景

1.函数调用的实现

2.倒着走的逻辑:如历史记录、撤销等

3.内存中的堆栈

4.STL库中的stack

存储结构:

Ⅰ)采用顺序存储结构实现——顺序栈

比如我们申请一个十个大小的int数组,并随机存储一些数据

#define maxsize 10

这里需要注意:有时候为了方便描述,通常会借用“指针”两个字来称呼那个用于标记的变量

初始化:top=-1;栈顶我们用top指针指示(注意这里的指针不是真的指针),初始化时top=-1

Stack initStack(){
	Stack s;
	s.data = (int*)malloc(sizeof(int) * maxsize);
	if (s.data == NULL) {
		printf("空间分配失败\n");
	}
	s.top = -1;
	return s;
}

入栈:top++;a[top]=k//或者写成a[++top]=k;

void Push(Stack* s, int k) {
	if (isFull(s) == 1) {
		printf("栈满");
	}
	else {
		s->top++;
		s->data[s->top] = k;
	}

}

出栈:top--;//top--之前的数据在出栈后会变成脏数据,所以不需要理会

void Pop(Stack* s) {
	if (isEmpty(s) == 1)
	{
		printf("栈空,不能出栈\n");
	}
	else
	{
		s->top--;
	}
}

判满:top==maxsize-1;的时候栈满

int isFull(Stack* s) {
	if (s->top == maxsize - 1) {
		return 1;
	}
	return 0;
}

判空:top==-1;top指向-1

int isEmpty(Stack* s)
{
	if (s->top == -1)
	{
		return 1;
	}
	return 0;
}

获取栈顶数据:x = a[top];

int getTop(Stack s)
{
	if (isEmpty(&s) == 1)
	{
		printf("栈空,没有数据\n");
		return -1;//特殊值 
	}
	return s.data[s.top];
}

整体代码示例: 

#include<stdlib.h>
#include<stdio.h>
#define maxsize 10
typedef struct {
	int* data;
	int top;
}Stack;

Stack initStack(){
	Stack s;
	s.data = (int*)malloc(sizeof(int) * maxsize);
	if (s.data == NULL) {
		printf("空间分配失败\n");
	}
	s.top = -1;
	return s;
}
int isFull(Stack* s) {
	if (s->top == maxsize - 1) {
		return 1;
	}
	return 0;
}
void Push(Stack* s, int k) {
	if (isFull(s) == 1) {
		printf("栈满");
	}
	else {
		s->top++;
		s->data[s->top] = k;
	}

}
int isEmpty(Stack* s)
{
	if (s->top == -1)
	{
		return 1;
	}
	return 0;
}
void Pop(Stack* s) {
	if (isEmpty(s) == 1)
	{
		printf("栈空,不能出栈\n");
	}
	else
	{
		s->top--;
	}
}

int getTop(Stack s)
{
	if (isEmpty(&s) == 1)
	{
		printf("栈空,没有数据\n");
		return -1;//特殊值 
	}
	return s.data[s.top];
}
int main() {
	Stack s= initStack();
	printf("%d\n", getTop(s));
	Push(&s, 1);
	printf("%d\n", getTop(s));
	Push(&s, 2);
	printf("%d\n", getTop(s));
	Push(&s, 3);
	printf("%d\n", getTop(s));
	Pop(&s);
	printf("%d\n", getTop(s));

}

初始化:top=0;//这个时候top标记的时真正的栈顶元素的上面一个位置

入栈:a[top]=k;top++;//或者写成a[top++]=k;

出栈:top--;

判满:top==maxsize;的时候栈满

判空:top==0;top指向0

获取栈顶数据:x = a[top-1];

Ⅱ)采用链式存储结构实现——链栈-->基于单链表(带头结点)

初始化:初始化一个带头结点的空链表

入栈:直接用头插法,则栈顶一直时首元结点,就直接用头指针做栈顶指针

linkstack initstack()
{
	linkstack s = (StackNode*)malloc(sizeof(StackNode));
	if (s == NULL)
	{
		printf("空间分配失败\n");
	}
	s->next = NULL;
	return s;
}

删除:删除首元结点

linkstack Pop(linkstack top)
{//出栈 删除首元节点 
	if (isEmpty(top) == 1)
	{
		printf("栈空,不能出栈\n");
	}
	else
	{
		StackNode* p = top->next;
		top->next = p->next;
		free(p);
		p = NULL;
	}
	return top;
}

判满:链表不需要判满

判空:L->next==NULL;

int isEmpty(linkstack top)
{
	if (top->next == NULL)
	{
		return 1;
	}
	return 0;
}

 整体代码示例:



#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10 
//链栈---基于带头结点的单链表实现
typedef struct StackNode {
	int data;
	struct StackNode* next;
}StackNode, * linkstack;
linkstack initstack()
{
	linkstack s = (StackNode*)malloc(sizeof(StackNode));
	if (s == NULL)
	{
		printf("空间分配失败\n");
	}
	s->next = NULL;
	return s;
}
linkstack Push(linkstack top, int k)
{//入栈 头插法 
	linkstack s = (StackNode*)malloc(sizeof(StackNode));
	if (s == NULL)
	{
		printf("空间分配失败\n");
		return top;
	}
	s->data = k;
	s->next = top->next;
	top->next = s;
	return  top;
}
int isEmpty(linkstack top)
{
	if (top->next == NULL)
	{
		return 1;
	}
	return 0;
}
linkstack Pop(linkstack top)
{//出栈 删除首元节点 
	if (isEmpty(top) == 1)
	{
		printf("栈空,不能出栈\n");
	}
	else
	{
		StackNode* p = top->next;
		top->next = p->next;
		free(p);
		p = NULL;
	}
	return top;
}
int getTop(linkstack top)
{
	if (isEmpty(top) == 1)
	{
		printf("栈空,没有数据\n");
		return -1;//特殊值 
	}
	else
	{
		return top->next->data;
	}
}
int main()
{
	linkstack top = initstack();
	top = Push(top, 1);
	printf("%d\n", getTop(top));
	top = Push(top, 2);
	top = Push(top, 3);
	printf("%d\n", getTop(top));

	top = Pop(top);
	printf("%d\n", getTop(top));
	return 0;
}

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

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

相关文章

安卓获取apk的公钥,用于申请app备案等

要申请app的icp备案等场景&#xff0c;需要app的 证书MD5指纹和公钥&#xff0c;示例如下&#xff1a; 步骤1&#xff1a;使用keytool从APK中提取证书 1. 打开命令行&#xff0c;cd 到你的apk目录&#xff0c;如&#xff1a;app/release 2. 解压APK文件&#xff1a; unzip yo…

一维稳态与非稳态导热的详细分析

目录 引言 一维稳态导热 应用实例&#xff1a;单层平壁导热 数值求解&#xff1a; 一维非稳态导热 应用实例&#xff1a;单层平壁的非稳态导热 温度变化阶段 表格总结&#xff1a; 引言 热传导&#xff08;Heat Conduction&#xff09;是热量在物体内部通过微观粒子的相…

批量从word切割说话人!!对于转录后的文本进行纯数据清洗切割和区分说话人-批量从word切割说话人

battle AI的全过程 文章目录 初步切割同时基于文本中提取的动词变化类别做切割以及发言人变化路径设置 迁移模型到GPUbert输出空白debugCPU能运行的语义相似度代码GPU能用了但是没有加切分规则的代码 根据动词变化切分把发言人替换老师和学生的代码读取txt的代码先区分说话人&a…

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件&#xff0c;类似于这样&#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5&#xff0c;in…

黑马点评22——最佳实践-批处理优化

文章目录 pipeline和mset集群模式下的批处理问题 pipeline和mset pipeline就是大数据量的导入&#xff0c;pipeline是在单机模式下的。 redis的处理耗时相比较网络传输的耗时其实是比较低的。 所以我们最好采用批处理&#xff0c; 集群模式下的批处理问题 在集群环境…

生动灵活,MegActor重磅升级!旷视科技发布MegActor-Σ:首个基于DiT的人像动画方法!

文章链接&#xff1a;https://arxiv.org/pdf/2408.14975 项目链接&#xff1a;https://megactor-ops.github.io/ 亮点直击 一种新颖的混合模态扩散Transformer&#xff08;DiT&#xff09;&#xff0c;能够有效整合音频和视觉控制信号。相较于之前基于UNet的方法&#xff0c;这…

qsort的理解--加强对指针的理解

前言&#xff1a;前面我们学习指针变量&#xff0c;数组指针变量&#xff0c;函数指针变量&#xff1b;这些实际上都是变量&#xff0c;实质上是在内存中开辟一块空间&#xff1b;而这些变量存储的都是地址。还有指针数组&#xff0c;函数指针数组&#xff0c;这指的是把多个地…

AIGC大模型扩图:Sanster/IOPaint(4)

AIGC大模型扩图&#xff1a;Sanster/IOPaint&#xff08;4&#xff09; 用大模型实现AI扩大一张图的周边区域&#xff0c;变得更大&#xff0c;当然必须契合原图&#xff0c;和原图浑然一体。 1、这次模型换用 Sanster/PowerPaint-V1-stable-diffusion-inpainting 启动&#xf…

文件对比工具--BeyondCompare

&#x1f496;简介 Beyond Compare 是一款功能强大的文件和文件夹比较工具&#xff0c;由Scooter Software开发。它可以帮助用户轻松地比较文件和文件夹的差异&#xff0c;并且可以合并变化、同步文件以及备份重要数据 &#x1f4bb;环境 windows &#x1f4d6;版本 Beyon…

RocketMQ安装与使用

什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型&#xff0c;它可以在分布式环境下扩展进程间的通信。对于消息中间件&#xff0c;常见的角色大致也就有Prod…

OpenCV高阶操作

在图像处理与计算机视觉领域&#xff0c;OpenCV&#xff08;Open Source Computer Vision Library&#xff09;无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下&#xff0c;采样 下采样&#xff08;Downsampling&#xff09; 下采样通常用于减小图像的…

日志相关知识

1.作用 a.为了代替System.out.println()&#xff0c;可以定义格式&#xff0c;重定向文件等。 b.可以存档&#xff0c;便于追踪问题。 c.可以按级别分类&#xff0c;便于打开或关闭某些级别。 d.可以根据配置文件调整日志&#xff0c;无需修改代码。 …

如何逆转Instagram账号流量减少?实用技巧分享

Instagram作为全球十大社媒之一&#xff0c;不仅是个人分享生活的平台&#xff0c;还是跨境卖家进行宣传推广和客户开发的关键工具。在运营Instagram的过程中&#xff0c;稍有不慎就容易出现账号被限流的情况&#xff0c;对于账号状态和运营工作的进行都十分不利。 一、如何判断…

图片预览、拖拽和缩放组件分享

业务场景 项目中不需要点击小图然后展示大图&#xff0c;类似于elementui中的Image图片组件。适用于直接展示大图&#xff0c;支持拖拽和缩放的场景&#xff0c;比如&#xff1a;用户需要比对两种数据的图片展示&#xff0c;左右两侧进行展示。 效果图 使用方式 在components…

宏任务和微任务+超全面试真题

概念 微任务和宏任务是在异步编程中经常使用的概念&#xff0c;用于管理任务的执行顺序和优先级。 宏任务&#xff1a;setTimeout, setInterval&#xff0c;I/O 操作和 UI 渲染等。微任务&#xff1a; Promise 回调、async/await等 微任务通常比宏任务具有更高的优先级。 执…

S7-1500替代S7-300全解析系列

硬件篇上 01 概述工控人加入PLC工业自动化精英社群 2022年十月初的时候&#xff0c;想必工控圈的小伙伴们都被S7-300系列即将于2023年10月1日退市的消息刷屏了吧&#xff1f;倒退到2020年的10月1日&#xff0c;同样伴随我们多年的ET200S系列也已经悄无声息地退市了。在感叹经…

GEE 将本地 GeoJSON 文件上传到谷歌资产

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;Google Earth Engine&#xff08;GEE&#xff09;是一个强大的平台&#xff0c;它允许用户处理和分析大规模地理空间数据。本文将介绍如何使用 Python 脚本批量上传本地 GeoJSON 文件到 GEE 资产存储&#xff0c;这对…

Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】

阅读导航 引言一、事件介绍二、如何重写相关的 Event 函数1. 事件的处理简介2. 示例重写鼠标相关的 Event 函数&#xff08;1&#xff09;新建Qt项目&#xff0c;设计UI文件&#xff08;2&#xff09;新添加MyLabel类&#xff08;3&#xff09;重写enterEvent()方法和leaveEven…

分享一个爬虫数据挖掘 农村产权交易数据可视化平台 数据分析大数据 Java、python双版(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

形式向好、成本较低、可拓展性较高的名厨亮灶开源了。

简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算法加…