数据结构——栈,队列和数组

news2024/11/26 12:00:36

文章目录

    • **一 栈**
      • **1 基本概念**
      • **2 栈的顺序存储结构**
        • **2.1 顺序栈的实现**
        • **2.2 顺序栈的基本运算**
        • **2.3 共享栈**
      • **3 栈的链式存储结构**
    • **二 队列**
      • **1 基本概念**
      • **2 队列的顺序存储结构**
        • **2.1 队列的顺序存储**
        • **2.2 循环队列**
        • **2.3 循环队列的操作**
      • **3 队列的链式存储结构**
        • **3.1 队列的链式存储**
        • **3.2 链式队列的基本操作**
      • **4 双端队列**
    • **三 栈和队列的应用**
      • **1 栈的括号匹配问题**
      • **2 栈的表达式求值问题**
      • **3 栈的递归问题**
      • **4 队列的层序遍历问题**
      • **5 队列的计算机系统的应用**
    • **四 数组和特殊矩阵**
      • 1 数组
      • **2 特殊矩阵的压缩存储**
        • **2.1 对称矩阵**
        • **2.2 三角矩阵**
        • **2.3 三对角矩阵**
        • **2.4 稀疏矩阵**

一 栈

1 基本概念

栈是一种线性表,但是只能在一端插入或者删除,而且栈是先进后出(后进先出)的

n个不同元素的排列个数有1/(n+1)*C2nn

在这里插入图片描述

基本操作:

Initstack(&S);           \\初始化一个空栈
Stackempty(S);           \\判空
push(&S,X);              \\进栈
pop(&s,&x);              \\出栈
gettop(&s,&x);           \\读栈顶元素
destroystack(&s);        \\销毁栈

2 栈的顺序存储结构

2.1 顺序栈的实现

采用顺序存储,利用一组地址连续的存储单元存放,设一个指针指示当前栈顶元素的位置

#define maxsize 50
typedef struct
{
    elemtype data[maxsize];
    int top;                        \\初始为-1
}Sqstack;

受数组上限的约束,可能发生溢出

2.2 顺序栈的基本运算

在这里插入图片描述

(1)初始化

viod Initstack(sqstack &s)
{
      s.top=-1;
}

(2)判空

bool stackempty(sqstack &s)
{
     if(s.top==-1)
         return true;
     else
         return false;
}

(3)进栈

bool push(sqstack &s,elemtype x)
{
        if(s.top==maxsize-1)
           return false;
        s.data[++s.top]=x;
        return true;
}

(4)出栈

bool pop(sqstack &s,elemtype &x)
{
      if(s.top==-1)
          return false;
      x=s.data[s.top--];
      return true;
}

(5)读栈顶元素

bool gettop(sqstack s,elemtype &x)
{
     if(s.top==-1)
         return false;
     x=s.data[s.top];
     return true;
}

2.3 共享栈

两个顺序栈共享一个一维数组

在这里插入图片描述

top0=-1时0号栈为空,top1=maxsize时1号栈为空

仅当两个栈顶指针相邻,top1-top0=1时,栈满

0号栈进栈,top0先加1再赋值;1号栈进栈top1先减1再赋值;出栈时相反

3 栈的链式存储结构

称为链栈,便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况,通常用单链表实现,规定所有操作在表头进行

没有头结点,Lhead指向栈顶元素

在这里插入图片描述

typedef struct Linknode
{
    elemtype data;
    struct  Linknode  *next;
}*Listack;

二 队列

1 基本概念

也是一种操作受限的线性表,但是只允许一端插入,一端删除,即先进先出

在这里插入图片描述

Initqueue(&Q);            \\初始化
Queueempty(Q);            \\判空
Enqueue(&Q,x);            \\入队
Dequeue(&Q,&x);           \\出队
Gethead(Q,&x);            \\读队头元素

栈和队列都不能随意读取中间的元素

2 队列的顺序存储结构

2.1 队列的顺序存储

分配一块连续的存储单元,设两个指针,队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置

#define maxsize 50
typedef struct
{
    elemtype data[maxsize];
    int front,rear;            \\初始都为0
}Sqqueue;

不能用Q.rear==maxsize来判断队列满的条件,如图

在这里插入图片描述

2.2 循环队列

由顺序队列的缺点,引出循环队列

将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,利用除法取余运算来实现

队首指针进1:Q.front=(Q.front+1)%maxsize

队尾指针进1:Q.rear=(Q.rear+1)%maxsize

队列长度:(Q.rear+maxsize-Q.front)%maxsize

出队入队时指针都要按顺时针方向进1

判空可以用Q.front=Q.rear,但是满队时也有Q.front=Q.rear,如图

在这里插入图片描述

区分队空还是队满的解决方法:

(1)牺牲一个单元来区分,入队时少用一个队列单元,约定以队头指针再队尾指针的下一个位置作为队满的标志

队满:(Q.rear+1)%maxsize==Q.front

队空:Q.front==Q.rear

队列元素的个数:(Q.rear+maxsize-Q.front)%maxsize

(2)增设表示元素个数的成员size

队空:Q.size==0

队满:Q.size == maxsize

两种情况都有Q.front==Q.rear

(3)增设tag数据成员

tag=0,若因删除导致Q.front==Q.rear,队空

tag=1,若因插入导致Q.front==Q.rear,队满

2.3 循环队列的操作

(1)初始化

void Iinitqueue(Sqqueue &Q)
{
     Q.rear=Q.front=0;
}

(2)判空

bool isempty(Sqqueue Q)
{
    if(Q.rear==Q.front)
        return true;
    else
        ruturn false;
}

(3)入队

bool Enqueue(Sqqueue &Q,elemtype x)
{
    if((Q.rear+1)%maxsize == Q.front)
        return false;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%maxsize;
    return true;
}

(4)出队

bool Dequeue(Sqqueue &Q,elemtype &x)
{
    if(Q.rear == Q.front)
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%maxsize;
    return true;
}

3 队列的链式存储结构

3.1 队列的链式存储

实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点

typedef struct Linknode           \\队列结点
{
     elemtype data;
     struct Linknode *next;
}Linknode;

typedef struct                    \\链式队列
{
   Linknode *front,*rear;
}*LinkQueue;

Q.front==NULL,Q.rear==NULL时队列为空

通常设计为带头结点,统一删除和插入操作;适合于数据元素变动比较大的情形

在这里插入图片描述

3.2 链式队列的基本操作

(1)初始化

void Initqueue(Linkqueue &Q)
{
    Q.front = Q.rear=(Linknode*)malloc(sizeof(Linknode));   \\建立头结点
    Q.front->next=NULL;                                     \\初始为空
}

(2)判空

bool isempty(Linkqueue Q)
{
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}

(3)入队

void Enqueue(Linkqueue &Q,elemtype x)
{
    Linknode *s=(Linknode*)malloc(sizeof(Linknode));
    s->data=x;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}

(4)出队

bool Dequeue(Linkqueue &Q,elemtype &x)
{
    if(Q.front == Q.rear)
        return false;
    Linknode *p=Q.front->next;
    x=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)
        Q.rear=Q.front;
    free(p);
    return true;
}

4 双端队列

允许两端都可以进行入队和出队操作,逻辑结构仍是线性结构

在这里插入图片描述

输出受限:

在这里插入图片描述

输入受限:

在这里插入图片描述

三 栈和队列的应用

1 栈的括号匹配问题

在这里插入图片描述

2 栈的表达式求值问题

在这里插入图片描述

在这里插入图片描述

3 栈的递归问题

int fib(int n)                      \\递归实现斐波那契数列
{
     if(n==0)
         return 0;
    else if (n==1)
        return 1;
    else
        return fib(n-1)+fib(n-2);
}

但是递归次数过多容易造成栈溢出,转换为非递归需要借助栈

4 队列的层序遍历问题

在这里插入图片描述

在这里插入图片描述

5 队列的计算机系统的应用

(1)解决主机与外部设备之间速度不匹配的问题

设置一个数据缓冲区,这个缓冲区存储数据就是一个队列

(2)解决多用户引起的资源竞争问题

按请求的先后顺序入队

四 数组和特殊矩阵

1 数组

数组是线性表的推广,以为数组可视为一个线性表,二维数组可视为其元素也是定长线性表的线性表

对于多维数组,有两种存储映射方式,按行优先和按列有限

2 特殊矩阵的压缩存储

压缩存储:为多个值相同的元素只分配一个存储空间,对零元素不分配空间

常见的特殊矩阵:对称矩阵,上(下)三角矩阵,对角矩阵

2.1 对称矩阵

在这里插入图片描述

元素下标的对应关系

k=i(i-1)/2+j-1,i ⩾ \geqslant j,下三角区和主对角线元素

k=j(j-1)/2+i-1,i<j,上三角区元素aij=aji

下标从1开始

2.2 三角矩阵

在这里插入图片描述

下三角矩阵

k=i(i-1)/2+j-1,i ⩾ \geqslant j,下三角区和主对角线元素

k=n(n+1)/2,i<j,上三角区元素(常数项)

在这里插入图片描述

上三角矩阵

k=(i-1)(2n-i+2)/2+j-i,i ⩽ \leqslant j,上三角区和主对角线元素

k=n(n+1)/2,i>j,下三角区元素(常数项)

在这里插入图片描述

下标从0开始

2.3 三对角矩阵

在这里插入图片描述

下标:k=2i+j-3

反之若知道k,则 i=(k+1)/3+1,向下取整

j=k-2i+3

2.4 稀疏矩阵

矩阵中非零个数非常少

为节省空间,将非零元素和相应的行和列构成一个三元组(行,列,值)

但是不能随机存取

在这里插入图片描述

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

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

相关文章

JS 怎么理解ES6新增Set、Map两种数据结构?

目录 一、前言 二、Set 1.Set数据结构定义 2.Set数据结构的特性 3.Set数据结构的基本使用 4.Set遍历数据 5.Set 的使用场景 6.WeakSet的使用 7.垃圾回收机制 三、Map 1.Map数据结构定义 2.Map数据结构的特性 3.Map数据结构的基本使用 4.Map遍历数据 5.Map的使用场…

总结895

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff09;…

chatgpt赋能python:Python入门到精通

Python入门到精通 Python是一门高级编程语言&#xff0c;由于其易读、易理解的语法&#xff0c;被广泛应用于数据分析、人工智能、爬虫、Web开发等领域。对于想要学习Python的人来说&#xff0c;本文提供了一个从入门到精通的学习路线。 入门级别 在Python的入门阶段&#x…

unity 建立urp项目并使用后处理技术的方法

文章目录 一、 介绍下载、安装Univarsal RP创建配置文件打开 Project Settings参数介绍在这里插入图片描述General 通用选项Quality 画面品质Lighting 灯光设置Shadow 投影 阴影Post Processing 后处理后处理的添加Advanced 高级选项 一、 介绍 Unity URP是Unity官方提供的轻量…

CKA 02_containerd部署Kubernetes 部署containerd 使用kubeadm引导集群 安装Pod网络

文章目录 1. 清空实验环境2. containerd 部署 Kubernetes2.1 部署 containerd2.1.1 安装 containerd2.1.2 配置 containerd2.1.3 前置条件2.1.4 从 Docker 命令行映射到 crictl出现的第一个 error解决方法 2.2 使用 kubeadm 引导集群2.2.1 使用 kubeadm 创建单个控制平面的 Kub…

在Linux上安装MYSQL,保姆级教程,看完不会博主吃电脑~

前言 Linux上安装软件相对windows要更要复杂一些&#xff0c;流程可能让很多人感到有些复杂。而MYSQL作为常用的数据库软件&#xff0c;又属于不得不学的那类&#xff0c;因为今天就来分享一下我安装MYSQL的简易流程&#xff0c;保证小白也能跟着操作。 这次使用的是RPM的方式…

chatgpt赋能python:Python如何制作优秀的表格以实现SEO?

Python如何制作优秀的表格以实现SEO&#xff1f; 在当今数码环境下&#xff0c;SEO已经成为了一种重要的市场推广策略。而作为一种常用的编程语言&#xff0c;Python不仅可以方便快捷地完成数据处理和分析&#xff0c;也可以用于创建各种形式的表格。本文将介绍Python如何制作…

chatgpt赋能python:Python如何全选?

Python如何全选&#xff1f; 随着Python在Web开发&#xff0c;数据科学&#xff0c;人工智能和机器学习等领域的不断普及&#xff0c;越来越多的程序员使用Python来构建各种应用程序。但是有时候在编写Python代码时&#xff0c;需要快速地全选某段代码、某个模块或某个文本编辑…

chatgpt赋能python:Python自动化:提升SEO效果的必备技能

Python自动化&#xff1a;提升SEO效果的必备技能 随着互联网的快速发展&#xff0c;SEO已经成为大多数企业网络营销的关键词。提升SEO效果需要不断地对网站进行优化&#xff0c;而网站的更新频率、文章的质量和关键词的选择都是至关重要的因素。然而&#xff0c;人工操作复杂的…

chatgpt赋能python:Python中如何创建输入框

Python中如何创建输入框 在Python中&#xff0c;用户输入是非常常见的任务。而为了进行用户输入&#xff0c;我们需要创建一个输入框。 在本文中&#xff0c;我们将探讨Python中如何创建输入框&#xff0c;并将介绍一些关于SEO的最佳实践和技巧。 创建输入框 在Python中&…

chatgpt赋能python:Python怎么全屏

Python 怎么全屏 什么是全屏 全屏指的是让软件的窗口最大化&#xff0c;占据整个屏幕的空间。这种状态下&#xff0c;用户可以更加专注于软件的内容&#xff0c;降低外界环境的干扰。 在 Python 中全屏的作用 在 Python 的开发过程中&#xff0c;全屏有助于让程序员将注意力…

【交流分享】果断抛弃layer的对话框,自己写了一个对话框,兼容Android和IOS

没有用nativeUI的对话框,因为没法自定义,样式也不好看; 后来都说推荐用layer对话框http://layer.layui.com/mobile/ 但是发觉问题还蛮多: 1.Android上确定按钮错位,得自己css调行高 2.关闭的时候,按钮的事件会穿透,得自己写延时300毫秒关闭 3.IOS上点击弹出的按钮和对话框的按钮…

chatgpt赋能python:Python中如何出现行数?

Python中如何出现行数&#xff1f; 什么是行数&#xff1f; 在编程中&#xff0c;行数是指源代码中每一行的编号。行数的出现有助于开发人员更好地定位错误和调试代码。Python中也可以很容易地实现行数的显示。 如何在Python中出现行数&#xff1f; Python中有两种方法可以…

CKA 07_Kubernetes 工作负载与调度 控制器 ReplicaSet Deployment Jobs CronJob

文章目录 1. Pod 的分类2. 控制器类型3. ReplicaSet3.1 工作原理3.2 何时使用 ReplicaSet3.3 创建 ReplicaSet3.4 修改 RS 管理 pod 的标签3.5 还原 RS 管理 pod 的标签 4. Deployment4.1 准备工作4.2 用例4.3 创建 Deployment4.4 Deployment 进行 Pod 的版本更新4.5 Deploymen…

STM32单片机(四)第二节:OLED显示屏

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

java下载sun包下的源码

为什么要重下sun包&#xff1f; sun包下的类&#xff0c;都是.class文件。例如&#xff1a;sun.net.www.protocol.http.HttpURLConnection的源码&#xff0c;竟然是.class。原因是JDK自带的src.zip里面&#xff0c;压根没有放对应的源码文件。 如何下载sun包源码&#xff1f; …

chatgpt赋能python:Python编程与SEO:如何用Python写出最优化自己的姓名?

Python编程与SEO&#xff1a;如何用Python写出最优化自己的姓名&#xff1f; 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python编程在SEO优化方面所起的重要作用。Python语言简洁、灵活以及强大的功能&#xff0c;可以使我们更好地优化自己的网页排名。 在本篇…

Unreal5 实现武器切换功能

首先回忆一下之前在制作武器时&#xff0c;如何实现从后背拿武器的。我们创建了一个切换事件&#xff0c;判断当前是否持有武器&#xff0c;然后根据是否持有武器&#xff0c;去修改动画蓝图的变量&#xff0c;来触发从后面拿枪或者是否把枪放了回去。 然后在播放切枪动画时&am…

【MySql】数据库的增删改查

本篇的主要目的&#xff1a;对于数据库如何去增加删除查询修改 文章目录 创建数据库create查看数据库show删除数据库drop修改数据库alter 创建数据库create 主要细节在于选项问题&#xff0c;编码选项 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, cre…

让chatGPT使用Tensor flow Keras组装Bert,GPT,Transformer

让chatGPT使用Tensor flow Keras组装Bert,GPT,Transformer implement Transformer Model by Tensor flow Kerasimplement Bert model by Tensor flow Kerasimplement GPT model by Tensor flow Keras 本文主要展示Transfomer, Bert, GPT的神经网络结构之间的关系和差异。网络上…