第三章 栈、队列和数组

news2024/12/25 0:08:30

第三章 栈、队列、数组

    • 栈的基本概念
    • 栈的顺序实现
    • 栈的链接实现
    • 栈的简单应用和递归
  • 队列
    • 队列的基本概念
    • 队列的顺序实现
    • 队列的链接实现
  • 数组
    • 数组的逻辑结构和基本运算
    • 数组的存储结构
    • 矩阵的压缩存储
  • 小试牛刀

栈和队列可以看作是特殊的线性表,是运算受限的线性表

栈的基本概念

  • 栈是运算受限的线性表,插入和删除运算限定在表的某一端进行,允许进行插入和删除的一端为栈桥顶,另一端为栈底。不含任何数据元素的栈为空栈
  • 栈的修改原则是后进先出

栈的顺序实现

  • 栈的顺序存储结构是用一组连续的存储单元依次存放栈中的每个元素,并用始端做为栈底

在这里插入图片描述
注:进栈操作可以 如下表示:Push(栈名,进栈元素);出栈操作可以如下表示:Pop(栈名,出栈元素)

  • 初始化
int InitStack(SeqStk *stk)
{
stk——>top=0;
return 1;
}
  • 判栈空
int EmptyStack(SeqStk *stk)
//若栈为空,则返回1,否则返回0
{
if (stk->top==0)
	return 1;
else return 0;
}
  • 进栈
int Push(SeqStk *stk,DataType x)
{
IF (stk->top==maxsize-1)
	{error("栈已满");return 0;}
else { stk->top++;	//栈未满,top+1
		stk->data[stk->top]=x;	//元素x进栈
		return 1;
		}
}
  • 出栈
int Pop(SeqStk *stk)
{
	if {EmptyStack(stk)
	{error("下溢");return 0;}
	else
	{
	stk->top--;
	return 1;
	}
}
  • 取栈顶元素
DataType GetTop(SeqStk *stk)
{	if(EmptyStack(stk)) 
		return NULLData;
	else
		return stk->data[stk->top];
}
  • 双栈(两个栈头对头放数组两端)
const int max=40;
typedef struct Dbstack
{
DataType data[max];
int top1,top2;
}DbStk;

注:双栈判断上溢为top1+1=top2;判栈空为top1=0时,栈1为空;top2=max-1时栈2为空

栈的链接实现

  • 栈的链接实现称为链栈,链栈可以用带头结点的单链表实现,每个结点空间动态分配,不用预先考虑容量大小

在这里插入图片描述

  • 初始化
void InitStack(LkStk *LS)
{
LS=(LkStk *)malloc(sizeof(LkStk));
LS->next=Null;
}

在这里插入图片描述

  • 判栈空
int EmptyStack(LkStk *LS)
//若栈为空则返回值为1,否则返回0
{
if(LS->next==NULL)
	retun 1;
else
	return 0;
}
  • 进栈
void Push(LkStk *LS,DataType x)
{
LkStk *temp;
temp=(LkStk *)mallloc(sizeof(LkStk));	//temp指向申请的新结点
temp->data=x;	//新结点的data域赋值为x
temp->next=LS->next;	//temp的next域指向原来栈顶结点
LS->next=temp;	//指向新的栈顶结点
}

在这里插入图片描述

  • 出栈
int Pop(LkStk *LS)
//栈顶元素通过参数返回,直接后继成为新栈顶
{
LkStk *temp;
if(!EmptyStack(LS))
	{
	temp=LS->next;	//temp指向栈顶结点
	LS->next=temp->next;	//原栈顶的下一个结点成为新栈顶
	free(temp);	//释放原栈顶结点空间
	return 1;
	}
	else rturn 0;
}

在这里插入图片描述

  • 取栈顶元素
DataType GetTop(LkStk *LS)
{
if (!EmptyStack(LS))
	return LS->next->data;	//若栈为非空,返回栈顶数据元素
else
	return NULLData;	//返回空元素
}

在这里插入图片描述

栈的简单应用和递归

  • 如果在一个函数或数据结构的定义中又应用了它自身,那么这个函数或数据结构称为递归定义的
  • 递归定义必须同时满足以下两个条件
    • 被定义项在定义中的应用具有更小的“规模”
    • 被定义项在最小“规模”上的定义是非递归的
//求3的阶乘
#include<stdio.h>
long f(int n){
	if(n==0) 
		return 1;
	else
		return n*f(n-1);
}
main(){
int m,n=3;
m=f(n);
printf("%d!=%d\n",n,m)
}

在这里插入图片描述

队列

队列的基本概念

  • 队列是有限个同类型数据元素的线性序列,是一种先进先出的线性表(“排队”

在这里插入图片描述

队列的顺序实现

  • 由一个一维数组及两个分别指示队列首和队列尾的变量组成(数组、队列首指针和队列尾指针)
  • 类C语言定义顺序队列如下:
const int maxsize=20;
typeof struct seqqueue
{
DataType data[maxsize];
int font,rear;
}SeqQue;
SeqQue SQ;

在这里插入图片描述
注:入队列操作

SQ.rear=SQ.rear+1;
SQ.data[SQ.rear]=x;

出队列操作:

SQ.front=SQ.front+1;
  • 循环队列:将存储队列的一维数组首尾相接,形成环状

在这里插入图片描述
注:入队列操作如下:

SQ.rear=(SQ.rear+1)%maxsize;
SQ.data[SQ.rear]=x;

出队列操作为:

SQ.front=(SQ.front+1)%maxsize;

判队列满条件为:

((SQ.rear+1)%maxsize==SQ.front)

判断队列空的条件为:

(SQ.rear==SQ.front)
  • 队列的初始化
void InitQueue(CyQue CQ)
{
CQ.front=0;
CQ.front=0;
}
  • 判断队列空
int EmptyQueue(CycQue CQ)
{
if(CQ.rear==CQ.front)
	return 1;
else
	return 0;
}
  • 入队列
int EnQueue(CycQue CQ,DataType x)
{
if ((CQ.rear+1)%maxsize==CQ.front)
	{error("队列满");return 0;}	//队列满,入队列失败
else{
	CQ.rear=(CQ.rear+1)%maxsize;
	CQ.data[CQ.rear]=x;
	return 1;
	{
}
  • 出队列
int OutQueue(CycQue CQ)
{
if(EmptyqUEUE(CQ))
	{error("队列空");return 0;}
else{
	CQ.front=(CQ.front+1)%maxsize;	//不为空,出队列
	return 0;
}
}
  • 取 队列首元素
DataType GetHead(CycQue CQ)
{
if (EmptyQueue(CQ))
	return NULLData;
else
	return CQ.data[(CQ.front+1)%maxsize];
}

队列的链接实现

  • 队列的链接实现是使用一个带头结点的单链表来表示队列

在这里插入图片描述

  • 队列初始化
void InitQueue(LkQue *LQ)
{
LkQueNode *temp;
temp=(LkQueNode *)malloc(sizeof(LkQueNode));	//生成队列的头结点
LQ->front=temp;	//队列头指针指向队列头结点
LQ->rear=temp;	//尾结点指向列尾结点
(LQ->front)->next=NULL;
}

在这里插入图片描述

  • 判断队列空
int EmptyQueue(LkQue LQ)
{
if(LQ.rear==LQ.front)
	return 1;	//队列为空
else
	return 0;
}
  • 入队列
void EnQueue(LkQue *LQ,DataType x)
{
LkQueNode *temp;
temp=(LkQueNode *)malloc(sizeof(LkQueNode));
temp->data=x;
temp->next=NULL;
(LQ->rear)->next=temp;	//新结点入队列
LQ->rear=temp;	//置新的队列尾结点
}

在这里插入图片描述

  • 出队列
OutQueue(LkQue *LQ)
{
LkQueNode *temp;
if(EmptyQueuq(CQ))
	{error("队空");retturn 0;}
else{
	temp=(LQ->front)->next;	//使temp指向队列的首结点
	(LQ——>front)——>next=temp->next;	//修改头结点的指针域指向新的首结点
	if(temp->next=NULL)
		LQ->rear=LQ->front;
		free(temp);
		return 1;
	}	

}

在这里插入图片描述

  • 取队列首元素
DataType GetHead(LkQue LQ)
{
LkQueNode *temp;
if(EmptyQueue(CQ))
	return NULLData;
else{
	temp=LQ.front->next;
	return temp->data;	//队列非空,返回队列首结点元素
}
}

数组

数组的逻辑结构和基本运算

  • 一维数组又称为向量,由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中。一维数组中的数据元素又是一堆数组结构,则称为二维数组

在这里插入图片描述

数组的存储结构

  • 一维数组元素的内存单位地址是连续的;二维数组有两种存储方法:以列序为主序的存储、以行序为主序的存储;类C语言编译程序中,采用以行序存储、某些语言编译程序,以列序为主序的存储方式

在这里插入图片描述

  • 对于二维数组a[m][n],如果每个元素站K个存储元素,以行为主序为例;a[i][j]之前有i行元素,每行n个元素;在第i行有j+1个元素;共计ni+j+1;第一个元素距离a[i][j]相差ni+j个位置
//a[行][列]
a[3][4]

在这里插入图片描述

矩阵的压缩存储

  • 对称矩阵:若一个n阶方阵A中满足下述条件:

aij=aji 0<=i,j<=n-1

在这里插入图片描述

在这里插入图片描述
注:设矩阵aij在数组M中位置为k,(i,j)和k存在如下关系:
在这里插入图片描述

  • 三角矩阵:以主对角线为界的上下半部分是一个固定的值c或零,这样的矩阵叫做上(下)三角矩阵

在这里插入图片描述

在这里插入图片描述

  • 稀疏矩阵:假设m行n列的矩阵有t个非零元素,当t<<m*n,则称矩阵为稀疏矩阵

在这里插入图片描述

-  稀疏矩阵中所有非零元素用三元组的形式表示,并按照一定的次序组织在一起,就形成了三元组表示法

在这里插入图片描述
注:v为非零元素,i为非零元素v所在矩阵的行号,j为所在矩阵的列号

小试牛刀

  • 栈称为________线性表;队列称为_______线性表
  • 设有二维数组int M[10][20],每个元素占2个存储单位,数组的起始地址为2000,元素M[5][10]的存储位置为______,M[8][19]的存储位置为_______
  • 对稀疏矩阵进行压缩存储的目的是节省_______
  • 一个10X10阶对称数列A,采用行优先顺序压缩存储上三角元素,a00为第一个元素,其存储地址为0,每个元素占用1个存储单元,则a45的地址为______
  • 对吸收矩阵进行压缩存储的目的是节省______
  • 一个队列的输入序列是1,2,3,4,则队列的输出序列是_______
  • 元素进栈次序为A,B,C,D,E,则栈中的出栈顺序可能为_________

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

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

相关文章

Nmap扫描教程-01

Nmap扫描教程 SYN扫描操作及原理&#xff08;半连接扫描&#xff09; 1. 第一步打开wireshark选着你要监听网卡 2. 在kail中输入命令找到我们需要扫描主机的ip地址 arp-scan -l -I eth1 3. 在kail中输入命令进行SYN半连接扫描 nmap -sS -p80 --reason -vvv 172.30.1.128 -s…

这是要被奖金给砸晕啊......

嗨咯&#xff0c;大家好&#xff0c;我是K同学啊&#xff01; 由于最近训练营中经常有同学问我&#xff0c;有哪些比较好的知识变现且可以提升自己专业水平的渠道&#xff0c;这几天整理出了一个个人认为还不错的关于深度学习方面的大赛&#xff08;就奖金比较多而已&#xff…

服务器启用SGX(以PowerEdge R750为例)

一、检查处理器是否支持SGX 在shell中输入以下命令查看CPU型号 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c在Product Specifications中找到对应的处理器参数信息&#xff0c;如果支持SGX&#xff0c;可以在Security & Reliability中看到如下信息 二、以“软…

【centos7安装ElasticSearch】

概述 最近工作中有用到ES &#xff0c;当然少不了自己装一个服务器捣鼓。本文的ElasticSearch 的版本&#xff1a; 7.17.3 一、下载 ElasticSearch 点此下载 下载完成后上传至 Linux 服务器&#xff0c;本文演示放在&#xff1a; /root/ 下&#xff0c;进行解压&#xff1…

R实现地图相关图形绘制

大家好&#xff0c;我是带我去滑雪&#xff01; 地图相关图形绘制具有许多优点&#xff0c;这些优点使其在各种领域和应用中非常有用。例如&#xff1a;地图相关图形提供了一种直观的方式来可视化数据&#xff0c;使数据更容易理解和分析。通过地图&#xff0c;可以看到数据的空…

来单提醒/客户催单 ----苍穹外卖day9

来单提醒 需求分析 代码开发 注意:前端请求的并不是8080端口;而是先请求Nginx,Nginx进行反向代理以后转发到8080端口 这段代码首先创建了一个orders类用于更新订单状态 并且在更新状态后使用websocket发送给后端提醒 将信息放在map后,使用json的string化方式传给一个接收对象,…

使用wireshark解密ipsec ISAKMP包

Ipsec首先要通过ikev2协议来协商自己后续协商所用的加解密key以及用户数据的esp包用的加解密包。 ISAKMP就是加密过的ike-v2的加密包&#xff0c;有时候我们需要解密这个包来查看协商数据。如何来解密这样的包? 首先导出strongswan协商生成的各种key. 要能导出这些key&#…

“元创新·智生成” 第15届企业数智化学习大会公布嘉宾阵容

2023年是AIGC爆发年&#xff0c;与AI相关的创新应用迅速向各行各业渗透。 在企业培训领域&#xff0c;数字人、元宇宙等正逐渐成为企业在开展人才发展、业务培训等工作的工具&#xff0c;其高效、便捷、在线化、场景化等优势受到企业的热捧。在需求的推动下&#xff0c;企业培…

超实用的微信机器人功能:自动通过好友,自动打招呼,自动回复!!

无需下载软件 多号聚合 高效管理 1 自动通过好友 有新的好友请求时&#xff0c;系统会快速自动通过好友&#xff0c;免得错过客户。 同时能够多个微信设置&#xff0c;以及设置自动通过的时间段&#xff0c;只要还没通过就会等到我们设置的时间段里自动通过 2 自动打招呼 …

图片大小转换(对于图片进行压缩)

传入的是图片途径 import java.io.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.util.Base64;// 限制图像大小为4MB public byte[] limitImageSize(File imageFile, int maxSizeInBytes) throws IOException {if (imageFile.length() …

演唱会远景拍摄不清晰,一招秒变神图!

演唱会现场拍摄的照片不清晰&#xff0c;画质很模糊&#xff0c;遇到这种情况的图片&#xff0c;我们可以利用图片处理工具修复清晰。 我们用像素低的手机拍照或者拍摄的物体太远时&#xff0c;往往会拍出很模糊的照片&#xff0c;但是你又没办法再捕捉到刚才那精彩的一幕&…

Maven 依赖管理

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目&#xff08;包含成百上千个模块或者子项目&#xff09;&#xff0c;模块间的依赖关系就变得非常复杂&#xff0c;管理也变得很困难。针对此种情形&#xff0c;Maven 提供了一种高度控制的方法。 可传递性依赖发现 …

掌握这3点,企业就能规避收款业务中的合规风险

随着国家政策监管日趋严格&#xff0c;企业合规管理正在受到高度关注。在企业收业务款场景中&#xff0c;银行回单管理容易被忽略&#xff0c;若处理不当&#xff0c;将面临合规风险。具体表现如下&#xff1a; 审计依据不充分 银行回单是企业内部控制和合规管理的重要组成部…

idea新建一个module时,文件夹显示灰色/pom.xml文件显示灰色且中间有条横线

1.问题 2.解决方法 File->Settings->Ignored Files->找到勾选的pom.xml文件&#xff0c;取消勾选&#xff0c;点击ok即可。 3.已解决

使用 Databend Kafka Connect 构建实时数据同步

作者&#xff1a;韩山杰 Databend Cloud 研发工程师 hantmac (Jeremy) GitHub Kafka Connect 介绍 Kafka Connect 是一个用于在 Apache Kafka 和其他数据系统之间可扩展且可靠地流式传输数据的工具。通过将数据移入和移出 Kafka 进行标准化&#xff0c;使得快速定义连接器以在…

VBA技术资料MF68:更改所选区域边框颜色

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

039:mapboxGL更换地图上的鼠标样式

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中更换地图上的鼠标的样式。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共74行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…

赛事报名分组个人团体赛事小程序开发

基于ThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 版本&#xff1a;H5版本&#xff0c;目前只支持微信H5报名&#xff0c;公众号授权自动登录。 多动创建&#xff1a;支持多种活动创建&#xff0c;多种活动同时创建&…

【云原生】K8S对外服务之Ingress

目录 一、Ingress 简介1.1Ingress 组成1.3Ingress-Nginx 工作原理 二、部署 nginx-ingress-controller2.1部署ingress-controller Pod及相关资源2.2ingress 暴露服务的方式2.3 采用方式二&#xff1a;DaemonSetHostNetworknodeSelector 三、采用方式二&#xff1a;DeploymentNo…

DAZ To UMA⭐五.模型在Blender中的配置教程

文章目录 🟥 创建符合UMA的材质球属性1️⃣ 合并材质球🎁 选择材质球🎁 合并材质球🎁 删除多余材质球2️⃣ 将身体按材质球拆分🎁 进入身体编辑模式🎁 全选身体🎁 按材质分割身体🎁 重命名不同部位3️⃣ 将其余部位进行拆分🟧 更正选择缩放🟩 更新骨骼结构…