栈和队列(基础知识和基本操作)

news2024/11/23 13:30:08

栈:

1.栈:在表尾进行插入和删除的操作受限的线性表。

2.逻辑结构:线性结构【一对一的关系】

3.存储结构:顺序存储【顺序栈】、链式存储【链栈】

4.栈的特点:先进后出【first in last out FILO表】

后进先出【last in first out LIFO表】

栈空:下标top==-1,栈满:下标top==栈最大长度(MAXSIZE)-1。

栈的删除:头下标的移动,无法实现直接删除下表空间存储的值

链栈:

采用链式存储结构,没有栈满情况,动态申请空间,适用于数据量较大情况

 链栈的创建插入删除类似于单向链表的创建插入删除。

队列:

1.队列:在表尾插入,表头删除操作受限的线性表。

2逻辑结构:线性结构【一对一的关系】

3,存储结构:顺序存储【顺序队列、循环队列】、链式存储【链式队列】

4,队列的特点:先进先出【first in first out FIFO表】

后进后出【last in last out LILO表】

顺序队列:

1,线性表长度:数组长度,不变 #define MAXSIZE 8

2, 队头:第一个元素的下表

3,队尾: 最后一个元素后面的下表,原因方便下一个元素的插入

4,队空:队头==队尾

5,队满:rear==MAXSIZE

头定义:

#define MAXSIZE 50
typedef struct
{
    int fornt;//队的头下标
    int rear;//队的尾下标
    int data[MAXSIZE];//元素
}Queue;

循环队列:

队空:front(队头)==rear(队尾)

队满:front(头下标)==(rear(尾下标)+1)%MAXSIZE

头定义(类似于顺序队列):

#define MAX_SIZE 50//定义最大存储空间

typedef struct {
    int data[MAX_SIZE];
    int front;
    int rear;
} CircularQueue;

入队:

if(NULL==queue ||queue->front==(queue->rear+1)%MAXSIZE)//队未创建或者队满
    {
    //插入失败
    return -1;
    }
queue->data[queue->rear]=e;
queue->rear=(queue->rear+1)%MAXSIZE;

出队:

int delqueue(QueueList *queue)
{
    if(NULL==queue || queue->front==queue->rear)//判断队列是否创建和是否为空
    {
    //出队失败
    return -1;
    }
    printf("delqueue data is:%d\n",queue->data[queue->front]);
    queue->front=(queue->front+1)%MAXSIZE;//只是下标后移,未进行真正的删除
    return 0;

队列的遍历:

    if(NULL==queue || queue->front==queue->rear)//判断队列是否创建和队列是否为空
    {
        puts("output error");
        return;
    }
    for(int i=queue->front;i!=queue->rear;i=(i+1)%MAXSIZE)//下标从头开始后移逐个输出
    {
        printf("%d\t",queue->data[i]);
    }

 

计算循环队列有几个元素:

int loop_queue_count(QueueList *queue)
{
 return (MAXSIZE-queue->front+queue->rear)%MAXSIZE;
}

链式队列:

先进先出,如果是尾插创建,就需要使用头删删除最先插入的

如果使用头插创建,就需要使用头删删除最先插入的

链式队列的节点创建:

Linklist create_node()
{
    Linklist node=(Linklist)malloc(sizeof(struct Node));
    if(NULL==node)
        return NULL;
    node->data=0;//先定义初值为0
    node->next=NULL;
    return node;//返回地址
}

链式队列的入队:尾插(参考单向不循环链表的尾插)

Linklist insert_rear(datatype e,Linklist L)
{
    //创建你要插入的新节点
    Linklist s=create_node();
    s->data=e;//节点赋初值
    if(L==NULL)
    {
        L=s;
    }
    else
    {
        //rear指向最后一个节点的地址
        Linklist rear=L;
        while(rear->next!=NULL)//循环到最后一个节点
        {
            rear=rear->next;
        }
        rear->next=s;//尾节点指向新建的插入节点,令新建的节点为尾节点,实现尾插
    }
    return L;
}

链式队列的出队:头删(参考单向不循环链表的头删)

Linklist delete_head(Linklist L)
{
    if(NULL==L)//判断链表是否为空
    {
        return L;//为空直接输出空链表
    }
    if(L->next==NULL)//只有一个节点直接释放
    {
        free(L);
        L=NULL;
    }
    else//删除头节点的下一个节点,将值赋给头节点
    {
        Linklist q=L->next;
        L->data=q->data;
        L->next=q->next;
        free(q);
        q=NULL;
    }
    return L;

链式队列的遍历输出:

int link_output(Linklist L)
{
    //判断是否创建
    //判断是否为空
    if(NULL==L)
    {
        return -1;
    }
    while(L!=NULL)
    {
        printf("%d\t",L->data);
        L=L->next;//下标后移
    }
}

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

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

相关文章

消息队列 CKafka 跨洋数据同步性能优化

导语 本文主要介绍了 CKafka 在跨洋场景中遇到的一个地域间数据同步延时大的问题,跨地域延时问题比较典型,所以详细记录下来做个总结。 一. 背景 为了满足客户跨地域容灾、冷备的诉求,消息队列 CKafka 通过连接器功能,提供了跨…

5.4.tensorRT基础(2)-学习第一个插件的编写

目录 前言1. 插件2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 基础-学习第一个插件的编写 课程大…

python sorted函数

python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法。 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东西,字符串,字典,自己定义的类等。 sorted函数用法如…

【项目 进程6】 2.13 匿名管道通信案例 2.14管道的读写特点和管道设置为非阻塞

文章目录 2.13 匿名管道通信案例匿名管道的使用实现 ps aux | grep xxx 父子进程间通信 2.14管道的读写特点和管道设置为非阻塞管道的读写特点:总结设置管道非阻塞 2.13 匿名管道通信案例 匿名管道的使用 一般匿名管道不推荐父进程与子进程交叉读写数据&#xff0c…

nginx 配置 wss加密访问 mqtt

1. 在服务器上部署mqtt服务 2.在宝塔上配置域名证书 3.nginx配置websocket server {listen 80;listen 443 ssl http2;server_name ws-xx.example.com;index index.php index.html index.htm default.php default.htm default.html;root /www/wwwroot/ws-xx.example.com;loca…

金融软件技术:创新与安全并行驶

随着科技的迅速发展,金融行业正经历着一场前所未有的数字化转型。金融机构需要不断创新和提升效率,以满足客户需求,并保持竞争优势。在这个数字时代中,金融软件技术成为了实现这一目标的关键要素。本文将从两个方面探讨金融软件技…

fastadmin采坑之富文本编辑器

整了好久才弄好,后缀为content,类型为text 或者longtext类型,这样做命令行才能成功

Python教程(5)——Python的第一个程序

python的环境以及IDE都准备好之后,我们就可以开始Python之旅了。Python的第一个程序通常是打印输出"Hello, World!",非常简单。以下是一个示例: print("Hello, World!")运行python代码 首先必须明白python是一门动态语…

Asp.net Core配置CORS 跨域无效(记录一下)

问题 学习老杨的英语网站项目,运行项目时,发现出现了跨域的问题。 然后自己建一项目,进行配置,测试,发现配置CORS 跨域时,发现跨域的配置无效,依旧报错。 解决 网上找了一天,然后…

【Uniapp,Vue】阻止父元素事件覆盖子元素事件

有个需求,点击一个元素,让弹出框显示,点击弹出框以外的区域,就关闭弹出框,如下代码所示。 但是这样有个问题,就是当弹出框显示以后,点击弹出框的区域也会触发父元素的点击事件,使得i…

【多模态】17、CORA | 将 CLIP 使用到开集目标检测

文章目录 一、背景二、方法2.1 总体结构2.2 region prompting2.3 anchor pre-matching 三、效果 论文:CORA: Adapting CLIP for Open-Vocabulary Detection with Region Prompting and Anchor Pre-Matching 代码:https://github.com/tgxs002/CORA 出处…

小程序路由跳转页面重复问题

目标:想要某个页面在历史中(页面栈)只显示一次 什么是页面栈: 在小程序开发中,页面栈是指小程序当前打开的页面的层级关系堆栈。每当打开一个新页面时,它会被放置在页面栈的顶部,而当前页面就位…

如何实现外网远程访问路由内部服务器主机端口应用?

路由器是上网常见的设备。在我们开通网络接入带宽时,或需要进行管理路由网络操作时,就需要登录路由后台设置配置相关操作。 我们在涉及路由管理方面经常会遇到一些常见的问题。路由管理入口地址是什么?如何配置路由有线网络或无线网络或分配…

uniapp开启消息通知/提示(使用uniPush)

亲爱的小伙伴们,最近对uniPush有稍许研究,当前研究出一些心得,现在分项给大家,希望对大家的uniapp之路有所帮助。本次的教程是教会你如何使用uniPush自定义消息通知,同时还附带添加消息提示音添加,多的不说…

linux - ping -I 的一种异常场景处理分析

实验 用ping -I 指定一个没有配置ip地址且已经up起来的网卡。 结果 linux会根据路由规则选择一个其他网卡的ip,但,还是会从该指定网卡发送。 iputils 用-I指定网卡对应的bind操作 获取该socket的本地ip,当bind了NIC,且该NIC没有…

网络传输媒体

物理层下面的传输媒体分为两种:导向型传输媒体和非导向型传输媒体。 一、导向型传输媒体 同轴电缆: 图示: 分类: 基带同轴电缆:用于数字传输,在早期局域网中广泛使用宽带同轴电缆:用于模拟传输…

element+vue 之预览pdf组件

1.组件previewPdf <template><el-drawer:title"drawerName":visible.sync"drawerVal":direction"direction":append-to-body"true"size"100%":before-close"drawerClose"><iframe :src"url&…

前端工程化第二章:webpack5基础(中)

文章目录 1. 处理css资源&#xff08;css文件拆分 mini-css-extract-plugin&#xff09;1.1. package.json1.2. webpack.config.js 2. 处理预编译器&#xff08;less/scss&#xff09;2.1. src/index.js2.2. src/index.less2.3. src/index.scss2.4. webpack.config.js 3. 适配&…

【《机器学习和深度学习:原理、算法、实战(使用Python和TensorFlow)》——以机器学习理论为基础并包含其在工业界的实践的一本书】

机器学习和深度学习已经成为从业人员在人工智能时代必备的技术&#xff0c;被广泛应用于图像识别、自然语言理解、推荐系统、语音识别等多个领域&#xff0c;并取得了丰硕的成果。目前&#xff0c;很多高校的人工智能、软件工程、计算机应用等专业均已开设了机器学习和深度学习…

LeetCode55.Jump-Game<跳跃游戏>

题目&#xff1a; 思路&#xff1a; 大神的思路,我是不会... 代码是&#xff1a; //大神的代码code class Solution { public:bool canJump(vector<int>& nums) {int k 0;for (int i 0; i < nums.size(); i) {if (i > k) return false;k max(k, i nums[i…