栈和队列(一)

栈和队列的定义和特点

栈和队列是一种特殊的线性表,只能在表的端点进行操作

栈的定义和特点

这就是栈的结构,是一个特殊的线性表,只能在栈顶(或者说是表尾)进行操作。其中top为栈顶,base为栈底

栈s的存储结构示意图就这样,插入元素到栈中只能在top进行操作,称为入栈(push)

从栈顶tpo删除一个元素的操作pop称为出栈。

入栈示意图

出栈示意图

栈的操作特性:后进先出。

思考

假设有元素a,b,c入栈,那么有多少种出栈的顺序可能呢?

第一种a,b,c全入栈,然后出栈cba

第二种边进边出,a进a出,b进b出,c进c出。abc

第三种a进a出,b进c进,c出b出,acb

第四种a进b进,b出a出,c进c出,bac

第五种a进,b进b出,c进c出,a出,bca

思考小结

abc入栈共有5种出栈的方式,分别是cba,abc,acb,bac,bca那么cba为什么不能出现呢。这里考虑到栈的操作特性是先进的后出,abc入栈而cba违背了这个特性。由此想到我们生活中栈的例子,

栈又称为后进先出的线性表,简称LIFO

队列的定义和特点

队列示意图

有一个队列 Q=(a1,a2,a3,a4,.......,an)

a1为队头,an为队尾。通常在队尾进行插入,队头进行删除

队列的操作特性:先进先出。

栈的表示和操作实现

栈本身也是一种线性表,因此也可以分为顺序存储跟链式存储,分别是顺序栈和链栈

顺序栈的表示和实现

顺序栈在内存中的存储方式与线性表一样,因此我们利用一组地址连续的存储单元来依次存放栈底到栈顶的元素,栈底一般在低地址端。另外设置top指针指向栈顶,base指针指向栈底。(但是方便操作top一般指向真正的栈顶元素之上的下标地址)

这是一个长度为4的栈存储结构,我们使用top指向栈顶base指向栈底,此时栈顶与栈底指向的地址相同,表示栈中无元素即为空栈。此时要让a元素入栈,进行的操作如下,a元素进入栈然后top指针上移1个位置,进行++top。使得ABCD元素依次入栈如下图

观察到栈已满,此时top-base==max(这是栈满的标志)

对于栈满系统的处理方法一般是报错,不过还可以申请一个更大的空间把数据拷贝过去,从而形成一个新的栈。

我们上边使用数组来作为顺序栈的存储方式,简单方便但是容易产生溢出。因为我们的数组大小是固定的。栈满还要入栈此时空间不足产生上溢,栈空但是还要出栈元素此时下溢。在实际应用中我们一般把上溢作为一种错误,下溢作为结束条件。

因此我们定义顺序栈的时候需要定义三个元素的结构体就可以,包含一个指向栈顶的top指针和指向栈底的base指针还有栈的最大可用容量stacksize

typedef int elemtype;
typedef struct{elemtype *top;elemtype *base;int stacksize;
}sqstack;

有如下这样一个栈,将AB入栈

此时top指向下标为2的地址,base指向下标为0的地址。显然的top-base=2,这个2就是栈中元素的个数。但是再次将C D入栈,那么top会上移指向下标为4的地址,那么top-base=4就是栈中的元素个数5

顺序栈的初始化

typedef int elemtype;
typedef void status;
#define ERROR 0
#define OK 1
#define MAXSIZE 100
#include <stdio.h>
#include <stdlib.h>
typedef struct{elemtype *top;elemtype *base;int stacksize;
}sqstack;status lnitstack(sqstack *s){s->base=(elemtype*)malloc(sizeof(elemtype));//给栈底指针申请空间s->top=s->base;//令栈底跟栈顶指向的地址相同s->stacksize=MAXSIZE; return OK;
}

这里的结构体定义后,在后面函数定义传参的时候我们传入进去的是栈s的地址,因此形参列表是sqstack *s类型,在函数中要时引用成员top和base使用->的指向运算符,否则将编译失败。

判断栈是否为空

当栈底指针的指向与栈顶指针的指向相同时,栈为空;

int stackelemtype (sqstack s){if(s.top==s.base)return OK;elsereturn ERROR; 
}

求一个顺序栈的长度

建立一个栈,依次将ABC入栈,此时栈的长度为3.由此栈的长度计算为 top-base

int stacklength(sqstack s){return s.top-s.base;
} 

清空顺序栈

不管里面存了什么,只要将top指针指向栈底就是空,如果这个栈存在,S.base,有这样一个地址,那我们就 将top指针移下来,移动到和base指针的值相等

int clearstack(sqstack s){if(s.base)s.top=s.base;return OK;
} //清空顺序栈 

销毁栈

销毁栈不同于清空栈,销毁是在内存中不存在这样的栈了,栈的结构体定义里有栈顶指针top栈底指针base,还有栈的最大长度,销毁操作要使得最大长度置为0,top和base置为NULL

int destroystack(sqstack*s){if(s->base){free(s->base);s->stacksize=0;s->top=s->base=NULL;}return OK;
}

入栈

栈在进行入栈操作的时候首先我们要先判断栈是否满,若满则不能入栈。栈顶指针指向的是栈顶元素的下一个地方,我们先把要入栈的元素放到栈顶指针指向的地方,然后栈顶指针++

int push(sqstack *s,int e){if  (s->top==s->base)return ERROR;*(s->top)=e;s->top++;return OK;
}

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

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

相关文章

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图&#xff1a; 网络环境&#xff1a; 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

【Vulnhub靶场】Kioptrix Level 5

目标 本地IP&#xff1a;192.168.118.128 目标IP&#xff1a;192.168.118.0/24 信息收集 nmap探测存活主机&#xff0c;扫全端口&#xff0c;扫服务 首先探测到目标ip为&#xff1a;192.168.118.136 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.136nmap -sV -A 192.168.…

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1&#xff1a; 安装Burp Suite。官网链接&#xff1a;Burp Suite官网 step2&#xff1a; 设置代理 step3&#xff1a; 如果要拦截https请求&#xff0c;还需要在客户端安装证书 step4&#xff1a; 拦截到请求可以在Proxy ->…

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

opencv环境配置-适配b站阿童木的opencv教程

首先&#xff0c;opencv作为一个库文件&#xff0c;目的是为了让更多人不需要学习底层像素操作就能上手视觉技术&#xff0c;所以他适配很多环境&#xff0c;目前电脑端我知道的就可以适配C语言 C Python MCU端就是openmv跟他最类似&#xff0c;还有个k210 canmv 阿童木教的…

Unity 山水树木

本章节内容 1. Unity对3D游戏物体的简单操作&#xff1b; 2. 构建山水树木的场景 1. Unity 简易操作 1.1 新建3D游戏场景 1. 打开Unity Hub&#xff0c;点击 New Project &#xff08;新建项目&#xff09;按键&#xff0c;选择第二项 3D(Built-In Render Pipeline)&#xf…

Linux之实战命令41:lshw应用实例(七十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

虚拟滚动是怎么做性能优化的?

前言 一个简单的情景模拟&#xff08;千万别被带入&#xff09;&#xff1a; A&#xff1a; 假设现在有 10 万条数据&#xff0c;你作为前端该怎么优化这种大数据的列表&#xff1f; B&#xff1a; 针对大数据列表一般不会依次性加载&#xff0c;会采用上拉加载、分页加载等…

如何用数据字典提升数据质量和决策效率?

在前面的文章中我们谈到过数据字典的概念&#xff0c;本文将继续探讨如何用数据字典提升数据质量和决策效率。 一、数据字典 数据字典&#xff1a;一种对数据的定义和描述的集合&#xff0c;它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字…

Java中的一些名词概念

**函数式接口:** 概念&#xff1a;一个接口中的抽象方法只有一个&#xff0c;那么这个接口就是一个函数式接口。形参: 形参变量是**功能函数里的变量**&#xff0c;只有<u>在被调用的时候才分配内存单元</u>&#xff0c;<u>调用结束后立即释放</u>。…

AUTOSAR_EXP_ARAComAPI的6章笔记(2)

☞返回总目录 相关总结&#xff1a;AutoSar AP CM实例说明符的使用方法总结 6.2 实例说明符的使用方法 一、InstanceSpecifier 的概念 InstanceSpecifier 是在 [3] 中定义的一个核心概念&#xff0c;它由符合特定模型元素绝对路径的模型元素 shortName 组成&#xff0c;表现…

【10月最新】植物大战僵尸杂交版即将新增【植物】内容介绍预告(附最新版本下载链接)

新增植物 玉米旋转机 玉米旋转机是一种支持性植物&#xff0c;每4秒可散射6颗油炸玉米或黄油&#xff08;概率20%&#xff09;&#xff0c;油炸玉米经过火炬可变为爆米花&#xff0c;造成范围爆炸伤害。其价格为325&#xff0c;并在每种植一颗后&#xff0c;价格增加50。玉米旋…

Imagic: Text-Based Real Image Editing with Diffusion Models

https://openaccess.thecvf.com/content/CVPR2023/papers/Kawar_Imagic_Text-Based_Real_Image_Editing_With_Diffusion_Models_CVPR_2023_paper.pdfhttps://imagic-editing.github.io/ 问题引入 针对的是text based image editing问题&#xff0c;可以解决non rigid edit&am…

进程的了解

目录 一、进程控制块抽象&#xff08;PCB Process Control Block&#xff09; 1.pid&#xff1a;进程的身份标识 2.内存指针&#xff1a; 3.文件描述符表 进程的调度&#xff08;额外知识&#xff0c;不是进程属性&#xff09;&#xff1a; 4.进程的状态&#xff1a; 5.…

学习threejs,通过THREE.Raycaster给模型绑定点击事件

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Raycaster光线投射概…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

图神经网络

定义&#xff1a; 对图上所有的属性&#xff0c;包括顶点、边、全局、上下文进行的一个可以优化的变换&#xff0c;该变换可以保存住图的对称信息&#xff08;将顶点进行另外一个顺序的排序后&#xff0c;结果不变&#xff09; Message passing neural network&#xff1a;使…

Java爬虫API:获取商品详情数据的利器

为什么选择Java爬虫API 强大的库支持&#xff1a;Java拥有丰富的网络编程库&#xff0c;如Apache HttpClient、OkHttp等&#xff0c;这些库提供了强大的HTTP请求功能&#xff0c;使得发送请求和处理响应变得简单。高效的数据处理&#xff1a;Java的数据处理能力&#xff0c;结…

使用Yolov10和Ollama增强OCR

1. 训练自定义 Yolov10 数据集 利用物体检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。YOLO&#xff08;只看一遍&#xff09;是一种功能强大的实时对象检测模型&#xff0c;它将图像划分为网格&#xff0c;使其能够在一次前向传递中识别多个对象。这种方法非常适合…

【某农业大学计算机网络实验报告】实验二 交换机的自学习算法

实验目的&#xff1a; &#xff08;1&#xff09;理解交换机通过逆向自学习算法建立地址转发表的过程。 &#xff08;2&#xff09;理解交换机转发数据帧的规则。 &#xff08;3&#xff09;理解交换机的工作原理。 实验器材&#xff1a; 一台Windows操作系统的PC机。 实…