栈和队列——数据结构学习笔记

栈和队列

栈(Stack)

定义与特点

栈是一种特殊的线性表,只能从一端进行插入和删除——>后进后出 LIFO结构

表尾(an) 称为栈顶Top 表头(a1)称为栈底Base

插入元素到栈顶的操作称为入栈

删除栈顶最后一个元素的操作称为出栈

抽象类型定义

ADT Stack{
数据对象:D = {ai|ai∈ElemSet,i=1,2,3,...n,n≥0}
数据关系:R1 = {<ai-1,ai>|ai-1,ai∈D,i=2...,n}约定an端为栈顶,a1端为栈底
基本操作:初始化,进栈,出栈,取栈元素等
}ADT Stack

基础操作

InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空
StackLength(S):求栈长度
Push(&S, x):进栈——栈的插入操作
Pop(&S, &x):出栈——栈的删除操作
GetTop(S, &e):读栈顶元素
ClearStack(&S):栈置空
DestroyStack(&S):栈销毁

顺序栈

image-20240415195409994

为方便top指针指向栈顶元素之上的下标地址

stacksize ——> 栈可使用的最大容量

空栈的标志:base == top

栈满的标志: top - base == stacksize ———— 元素个数计算即top - base

上溢:栈满进行插入 下溢:栈空继续弹出

顺序栈的数据类型定义

#define MAXSIZE 100
typedef struct{SElemType *base;//栈底指针SElemType *top;//栈顶指针int stacksize;//栈可用最大容量
}SqStack;

顺序栈的初始化

Status lnitStack(SqStack &S)
{S.base = new SElemType[MAXSIZE];if(!S.base) exit (OVERFLOW);//存储分配成功S.top = S.base;S.stacksize = MAXSIZE;return OK;
}

判断顺序栈是否为空

Status StackEmpty(SqStack S)
{if(S.top == S.base)return TURE;elsereturn FALSE;
}

求顺序栈的长度

int StackLength(SqStack S)
{return S.top - S.base;
}

清空顺序栈

Status ClearStack(SqStack S){if(S.base) S.top = S.base;return OK;
}

销毁顺序栈

Status DestroyStack(SqStack &S){if(S.base){delete S.base;S.stacksize == 0;S.base = S.top = NULL;}return OK;
}

顺序栈的入栈

1.判断栈是否满,若满则出差(上溢)

2.元素e压入栈顶

3.栈顶指针加1

Status Push(SqStack &S, SElemType e){if(S.top - S.base == S.stacksize)return ERROR;*S.top++ = e;	//先e赋值给*S.top再移动指针++return OK;}
}

顺序栈的出栈

1.判断栈是否为空,空则出错(下溢)

2.获取栈顶元素e

3.栈顶指针-1

Status Pop(SqStack &S, SElemType &e){if(S.top == S.base)return ERROP;e = *--S.top;return OK;
}

链栈

image-20240415205357125

链栈指针方向与链表方向相反

· 链表的头指针就是栈顶

· 不需要头节点

· 基本不存在栈满的情况

· 空栈相当于头指针指向空

· 插入和删除仅在栈顶处执行

数据类型定义

typedef struct StackNode{SElemType date;struct StackNode *next;
}StackNode,*LinkStack;
LinkStack S;

初始化

void lnitStack(LinkStack &S){S = NULL;return OK;
}

判断链栈是否为空

Status StackEmpty(LinkStack S){if(S == NULL) return TURE;else return FlASE;
}

链栈入栈

Status Push(LinkStac &S,SElemType e){p = new StackNode;p -> date = e;P -> next = S;S = p;return OK;
}

链栈出栈

Status Pop(LinkStac &S,SElemType &e){if(S == NULL) return ERROR;e = S -> date;p = S;S = S -> next;delete p;return OK;
}

取栈顶元素

SElemType GetTop(LinkStack S){if(S!= NULL)return S -> date;
}

栈与递归

一个对象包含自己或自己给自己定义

一个过程直接或间接调用自己

分治法求递归问题算法的一般形式

void p(参数表){if(递归结束条件) 可以直接求解步骤; ——基本项else p(较小的参数);  ——归纳项  
}

队列(queue)

队列是一种先进先出的线性表(FIFO)

一端插入一端删除

抽象类型定义

ADT Queue{
数据对象:D = {ai|ai∈ElemSet,i=1,2,3,...n,n≥0}
数据关系:R1 = {<ai-1,ai>|ai-1,ai∈D,i=2...,n}约定a1端为队列头,an端为队列尾
基本操作:初始化,入队,出队等
}ADT Queue

基础操作

InitQueue (&Q)    构造空队列
DestroyQueue (&Q)  销毁队列
ClearQueue (&Q)      清空队列
QueueEmpty(Q)       判空. 空=TRUE,
QueueLength(Q)      取队列长度
GetHead (Q,&e)      取队头元素,
EnQueue (&Q,e)      入队列
DeQueue (&Q,&e)     出队列
QueueTraverse(Q,visit())      遍历

顺序队列

一维数组base[MAXQSIZE]表示

#define MAXQSIZE 100 //最大队列长度
Typedef struct{QElemType *base; //初始化的动态分配存储空间int front;	//头指针int rear; //尾指针
}SqQueue

初始状态 front = rear = 0

rear = MAXQSIZE 时发生溢出

front = 0 rear = MAXQSIZE时再入队 则为真溢出

front != 0 rear = MAXQSIZE时再入队 则为假溢出

对于假上溢如何解决 >>>

1.将对内元素依次向队头方向移动 (浪费时间)
2.循环:思路:base[0] 接在 base[MAXQSIZE-1] 之后 ,若 rear + 1 == MAXQSIZE, 则令 rear = 0;具体实现:用%的运算
插入元素:Q.base[Q.rear] = x;Q.rear = (Q.rear + 1) % MAXQSIZE;
删除元素:x = Q.base[Q.front]Q.front = (Q.front + 1 ) % MAXQSIZE

对于判断循环队空队满 >>>

当循环队列中队空队满都为 front == rear 如何解决
1.设标记
2.记录个数
3.少用一个元素空间 则队满: (rear + 1) % MAXQSZIE == front

初始化

Status lnitQueue(SqQueue &Q){Q.base = new QElemType[MAXQSIZE];if(!Q.base) exit(OVERFLOW);Q.front = Q.rear = 0;return OK;
}

求队列长度

int QueueLength(SqQueue Q){return ((Q.rear - Q.front + MAXQSZIE) % MAXQZIE);
}

入队

Status EnQueue(SqQueue &Q, QElemType e){if((Q.rear + 1) % MAXQSIZE == Q.front) return ERROR;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}

出队

Status DeQueue(SqQueue &Q, QElemType &e){if(Q.rear = Q.front) return ERROR;e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXQSZIE;return OK;
} 

取队头元素

SElemType GetHead(SqQueue Q){if(Q.rear = Q.front)return Q.base[Q.front];
} 

链队

当无法估计长度时,则宜采用链队列

类型定义

#define MAXQSIZE 100
typedef struct Qnode{QElemType data;stuct Qnode *next;
}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;
}LinkQueue;

初始化

Status lnitQueue(LinkQueue &Q){Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if(!Q.front) exit(OVERFLOW);Q.front -> next = NULL;return OK;
}

销毁链队列

Status DestroyQueue(LinkQueue &Q){while(Q.front){p = Q.front -> next;free(Q.front);Q.front = p;}//Q.rear = Q.front -> next; free(Q.front); Q.front = Q.rear;return OK;
}

入队

Status EnQueue(LinkQueue &Q, QElemType e){p = (QueuePtr)malloc(sizeof(QNode));if(!p) exit(OVERFLOW);p -> data = e;p -> next = NULL;Q.rear -> next = p;Q.rear = p;return OK;
}

出队

Status DeQueue(LinkQueue &Q, QElemType e){if(Q.front == Q.rear) return ERROR;p = Q.front -> next;e = p -> data;Q.front -> next = p —> next;if(Q.rear == p) Q.rear = Q.front;delepe p;return OK;
}

求链队列的队头元素

Status GetHead(LinkQueue Q, QElemType &e){if(Q.front == Q.rear) return ERROR;e = Q.front -> next -> data;return OK;
}

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

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

相关文章

编译OpenWRT固件

前言 编译环境&#xff0c;我是使用Ubuntu16.04.07 LTS 64位版 1.安装Ubuntu16.04.07 LTS 64 Ubuntu16.04.07 LTS 64安装的时候会出现一个bug&#xff0c;如果开始安装界面选了中文之后就会出现 提示错误信息&#xff1a;无法安装busybox-initramfs&#xff0c;向目标系统中…

openlayers 入门教程(六):controls 篇

目录 一、常用的控件 二、使用控件方法 三、添加删除control 的基本方法 四、control示例 1 比例尺 - ScaleLine 2 鹰眼/缩小图 - OverviewMap 3 全屏 - FullScreen 4 版权信息 - Attribution 5 旋转地图 - Rotate 6 放大缩小 - Zoom 7 缩放滑块控件 - ZoomSlider …

【Day 1】HTML 与 CSS

1 前端 网站的工作流程&#xff1a; 首先我们需要通过浏览器访问发布到前端服务器中的前端程序&#xff0c;这时候前端程序会将前端代码返回给浏览器浏览器得到前端代码&#xff0c;此时浏览器会将前端代码进行解析&#xff0c;然后展示到浏览器的窗口中&#xff0c;这时候我…

pwn - 零基础ROP之Android ARM 32位篇(新修订)

一、环境搭建 安装ndk r10e,必须得这个版本,其他版本可能导致 -fno-stack-protector 不生效! r10e Darwin: https://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zipLinux: https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_6…

51-41 Stable Video Diffusion,高质量视频生成新时代

23年11月&#xff0c;Stability AI公司公开了稳定视频扩散模型Stable Video Diffusion(SVD)的代码和权重&#xff0c;视频生成迎来了新时代。SVD是一种潜在扩散模型&#xff0c;支持文本生成视频、图像生成视频以及物体多视角3D合成。从工程角度来看&#xff0c;本文主要提出了…

Real3DPortrait照片对口型,数字人,音频/视频驱动数字人

先看效果 上传一张图片和一段音频&#xff0c;照片如下&#xff1a; 合成后效果如下&#xff1a; 照片对口型-音频驱动 支持音频驱动和视频驱动&#xff0c;视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…

[网络安全]-059-安全大模型以及训练数据集

Contents Tools IntegratedAuditReconnaissanceOffensiveDetectingPreventingSocial EngineeringReverse EngineeringInvestigationFixAssessmentCases ExperimentalAcademicB

真有立即做出40+BI零售数据分析报表的方案?

有&#xff0c;奥威BI零售数据分析方案是一套标准化的BI方案&#xff0c;预设零售数据分析模型和BI报表&#xff0c;点击应用后&#xff0c;将自动从系统中取数&#xff0c;并根据方案的预设计算分析指标、分析数据&#xff0c;并生成让人快速理解数据情况的BI数据可视化报表。…

Spark/SparkSQL读取Hadoop LZO文件概述

一、前置配置 IDEA Maven安装配置 Scala&#xff08;可选&#xff09; Java Hadoop.dll&#xff08;可能需要&#xff0c;具体看有无相关错误信息&#xff09; hadoop-lzo-0.xx.xx.jar&#xff08;如果你的版本过高&#xff0c;需要到官网下载高版本&#xff0c;mvnrepository仓…

服务器中毒怎么办?企业数据安全需重视

互联网企业&#xff1a; 广义的互联网企业是指以计算机网络技术为基础&#xff0c;利用网络平台提供服务并因此获得收入的企业。广义的互联网企业可以分为:基础层互联网企业、服务层互联网企业、终端层互联网企业。 狭义的互联网企业是指在互联网上注册域名&#xff0c;建立网…

react15升级17问题记录

,当前旧项目主要依赖版本介绍&#xff1a;这里只贴出重要依赖包的旧版本做展示&#xff0c;可以看到版本都相当落后了&#xff0c;升级的话会涉及一些API以及依赖的修改或者弃用 次文章只记录当前项目使用&#xff0c;其他项目不一定通用 {"react": "^15.6.1&q…

Lua语言 备查

开发工具 1.SciTE &#xff08;入门级&#xff09; IDEA lua &#xff08;商业级&#xff09; 基础 注释 --单行注释 a "hello" --a是一个标识符号--多行注释 --[[这是多行注释]]--连接符 -- .. str 123..456变量 变量类型可以随意改变 数字开头会报错 五种基本…

postman 调试 传base64字符串 原来选xml

上个图 工具类 package org.springblade.common.utils;import com.alibaba.fastjson.JSONObject; import org.springblade.modules.tc.mas.Submit;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStrea…

【FreeRTOS】使用CubeMX快速移植FreeRTOS工程到蓝桥杯开发板(STM32G431RBT6)

使用CubeMX快速创建FreeRTOS工程到蓝桥杯开发板&#xff08;STM32G431RBT6&#xff09; CubeMX配置CubeMX基础工程的配置☆FreeRTOS相关配置FreeRTOS配置选项卡的解释 软件工程架构与程序设计小综合&#xff1a;任务的创建删除、挂起与恢复设计cubexMX配置创建任务软件程序设计…

python怎么连接oracle

一&#xff1a;弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1a;系统版本&#xff0c;python版本&#xff0c;oracle客户端的版本&#xff0c;cx_Oracle的版本…

基于go+vue的多人在线聊天的im系统

基于govue的多人在线聊天的im系统 文章目录 基于govue的多人在线聊天的im系统一、前端部分二、后端部分1、中间件middleware设计jwt和cors2、配置文件设计3、Mysql和Redis连接4、路由设计5、核心功能设计 一、前端部分 打算优化一下界面&#xff0c;正在开发中。。。 二、后端…

OpenHarmony实战开发-如何使用Navigation实现多设备适配。

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

【WebLogic】Oracle发布2024年第二季度中间件安全公告

Oracle于美国时间2024年4月16日发布了 WebLogic 中间件2024年第二季度的安全公告&#xff0c;涉及漏洞共计 10 个&#xff0c;涉及示例程序的高危漏洞 1 个&#xff0c;中危漏洞中有3个涉及到核心组件&#xff08;Core&#xff09;。 此外&#xff0c;Oracle JDK1.8 的小版本号…

整理Meta GDC 2024 上关于XR、空间计算相关的分享

Meta 在 GDC 2024 上的全面覆盖,涵盖了如何利用 Meta Quest 构建全息游戏以及如何利用平台为开发者创造成功的会议。 视频分为 11 个部分,每个部分都是一场独特的会议,涵盖了从构建下一代 XR 体验到如何利用 Meta Quest 建立业务等话题 比如: 1、利用 Meta Quest 构建全息…

二分法在有序数组中的应用(JavaC)

文章目录 在有序数组中确定num是否存在Java实现C语言实现 在有序数组中找>num的最左位置Java实现C语言实现 在有序数组中找<num的最右位置Java实现C语言实现 在有序数组中确定num是否存在 Java实现 public static boolean exist(int[] arr, int num) {if (arr null ||…