数据结构:顺序循环队列

       队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。

队列两种规定:

1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;

2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;

       以下代码采用第二种规定。

       为区分空队与满队,满队元素个数比数组元素个数少一个,front=rear为空队。

queue.h

/*===============================================
*   文件名称:queue.h
*   创 建 者:cxy     
*   创建日期:2024年01月19日
*   描    述:
================================================*/
#ifndef _QUEUE_H
#define _QUEUE_H

#include <stdio.h>
#include <stdlib.h>

typedef struct queue{
    int *arr;   //malloc开辟
    int len;    //开辟大小
    int front;  //队头,初始0
    int rear;   //队尾,初始0
}Queue,*Pqueue;

int init(Pqueue *P,int len);
int empty(Pqueue p);
int full(Pqueue p);
int insert_queue(Pqueue p,int data);   //入队,队尾入
int delete_queue(Pqueue p,int *data);   //出队,先入先出,队头出

#endif

queue.c

/*===============================================
*   文件名称:queue.c
*   创 建 者:cxy     
*   创建日期:2024年01月19日
*   描    述:
================================================*/
#include "queue.h"

int init(Pqueue *P,int len)
{
    (*P) = malloc(sizeof(Queue));
    if(NULL == *P)
    {
        perror("init err:*P");
        return -1;
    }
    (*P)->arr = malloc(sizeof(int)*len);
    if(NULL == (*P)->arr)
    {
        perror("init err:(*P)->arr");
        free(*P);
        return -1;
    }
    (*P)->len = len;
    (*P)->front = 0;
    (*P)->rear = 0;

    return 0;
}

int empty(Pqueue p)
{
    if(NULL == p)
    {
        perror("empty err:p");
        return -1;
    }
    if(p->front == p->rear)
        return 1;
    else
        return 0;
}

int full(Pqueue p)
{
    if(NULL == p)
    {
        perror("full err:p");
        return -1;
    }
    if(p->front < p->rear && p->rear+1 == p->len)
        return 1;
    else if(p->front > p->rear && p->front-1 == p->rear)
        return 1;
    else 
        return 0;
}
int insert_queue(Pqueue p,int data)  //入队,队尾入
{
    if(NULL == p)
    {
        perror("insert err:p");
        return -1;
    }
    if(full(p))
    {
        perror("insert err:full");
        return -1;
    }

    p->arr[(p->rear++)%p->len] = data;

    return 0;
}
int delete_queue(Pqueue p,int *data)   //出队,先入先出,队头出
{
    if(NULL == p)
    {
        perror("delete err:p");
        return -1;
    }
    if(empty(p))
    {
        perror("delete err:empty");
        return -1;
    }
    
    *data = p->arr[(p->front++)%p->len];
    return 0;
}

main.c

/*===============================================
*   文件名称:main.c
*   创 建 者:     
*   创建日期:2024年01月19日
*   描    述:
================================================*/
#include "queue.h"

int main(int argc, char *argv[])
{ 
    Pqueue p;
    int data = 0;
    printf("请输入开辟空间大小:");
    scanf("%d",&data);

    init(&p,data);

    printf("----------empty,1为空---------\n");
    data= empty(p);
    printf("%d\n",data);

    printf("----------full,1为满---------\n");
    data = full(p);
    printf("%d\n",data);

    printf("----------insert_queue----------\n");
    printf("请输入入队数据 :");
    scanf("%d",&data);
    insert_queue(p,data);
    printf("请输入入队数据 :");
    scanf("%d",&data);
    insert_queue(p,data);
    printf("请输入入队数据 :");
    scanf("%d",&data);
    insert_queue(p,data);
    printf("请输入入队数据 :");
    scanf("%d",&data);
    insert_queue(p,data);
    printf("----------empty,1为空---------\n");
    data= empty(p);
    printf("%d\n",data);
    printf("----------full,1为满---------\n");
    data = full(p);
    printf("%d\n",data);

    printf("----------delete_queue----------\n");
    delete_queue(p,&data);
    printf("出队数据为:%d\n",data);
    delete_queue(p,&data);
    printf("出队数据为:%d\n",data);
    delete_queue(p,&data);
    printf("出队数据为:%d\n",data);
    delete_queue(p,&data);
    printf("出队数据为:%d\n",data);

    printf("----------empty,1为空---------\n");
    data= empty(p);
    printf("%d\n",data);
    printf("----------full,1为满---------\n");
    data = full(p);
    printf("%d\n",data);
  
    return 0;
} 

结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法第二十一天-丑数

丑数 题目要求 解题思路 首先判断数字是不是为0或者负数&#xff0c;两者均不可能成为丑数&#xff1b; 之后对n进行不断整除&#xff0c;直到无法除尽为止。 简单判断最后的数是不是1即可。 代码 class Solution:def isUgly(self, n: int) -> bool:if n<0:return Fa…

1.redhat网卡配置

想要通过cmd ping通redhat 1.在redhat输入:ifconfig 将自己主机网络适配器VMware Network Adapter VMnet1的IPv4配置在同一网段,掩码是255.255.255.0,所以最后一位不同就可以 推荐用FileZilla远程上传文件

【手撕C语言 第六集】函数(上)

文章目录 一、函数是什么&#xff1f;二、C语言中函数的分类&#xff1a;1.库函数1.1 如何学会使用库函数&#xff1f; 2. 自定义函数 三、函数的参数1.实际参数&#xff08;实参&#xff09;&#xff1a;2.形式参数&#xff08;形参&#xff09;&#xff1a; 四、函数的调用&a…

Java研学-spring框架(一)

一 概述 1 介绍 Spring框架是一个开源的Java EE应用程序框架&#xff0c;旨在简化Java企业级应用的开发难度和开发周期&#xff0c;主要通过控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;等技术实现。   容器&#xff08;Container&#x…

会计六要素

目录 会计六要素(一&#xff09;资产(二&#xff09;负债(三&#xff09;所有者权益(四&#xff09;收入、费用和利润一、收入二、费用三、利润 \quad 会计六要素 我国《企业会计准则》将企业会计要素分为 资产 负债 所有者权益 收入 费用 利润 \quad (一&#xff09;资产 定…

代码随想录二刷 |回溯 | 组合

代码随想录二刷 &#xff5c;回溯 &#xff5c; 组合 题目描述解题思路代码实现 题目描述 77.组合 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 解题思路 递归…

软考高项重点总结!看这一篇就够了❗️

&#x1f4da;信息系统项目管理师第四版g方教材有700多页&#xff0c;很多考生在翻书的时候总觉得书上内容太多&#xff0c;知识点也记不住&#xff0c;不知道哪些是重点。 &#x1f618;那今天我们来梳理一下。 &#x1f50d;这本书是有24章&#xff0c;但也不是都要精通的&am…

智慧文旅一机游:科技与文化的完美结合,引领智慧文旅新潮流,智慧旅游未来已来

一、科技与文化的完美结合&#xff1a;智慧文旅一机游的核心理念 智慧文旅一机游&#xff0c;是科技与文化相融合的产物&#xff0c;它不仅代表着旅游行业的创新与发展&#xff0c;更是一种文化与科技完美结合的生活方式。一机游的核心理念在于通过先进的科技手段&#xff0c;提…

java使用jsch处理软链接判断是否文件夹

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断…

08. Springboot集成webmagic实现网页爬虫

目录 1、前言 2、WebMagic 3、Springboot集成Webmagic 3.1、创建Springboot&#xff0c;并引入webmagic依赖 3.2、定义PageProcessor 3.3、元素选择 3.3.1、F12查看网页元素 3.3.2、元素选择 3.3.3、注意事项 4、小结 1、前言 在信息化的时代&#xff0c;网络爬虫已…

二叉树简单OJ题(及其后续函数补充)

OJ题 单值二叉树 首先呢&#xff0c;我们还是把问题分化一下&#xff0c;求一棵二叉树是否为单值二叉树&#xff0c;还是可以分为几个部分&#xff1a;根节点 左子树 右子树 而我们向下遍历的时候&#xff0c;其实就是在这个节点以及其左子树和右子树中找&#xff0c;是否值都…

本地git切换地区后,无法使用ssh访问github 22端口解决方案

问题 由于放假回家&#xff0c;发现之前一直使用正常的git&#xff0c;与github无法通讯&#xff0c;pull和push都无法连接。报错如下&#xff1a; connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. 原因 可能是所…

[学习笔记]刘知远团队大模型技术与交叉应用L3-Transformer_and_PLMs

RNN存在信息瓶颈的问题。 注意力机制的核心就是在decoder的每一步&#xff0c;都把encoder的所有向量提供给decoder模型。 具体的例子 先获得encoder隐向量的一个注意力分数。 注意力机制的各种变体 一&#xff1a;直接点积 二&#xff1a;中间乘以一个矩阵 三&#xff1a;…

常见Linux 命令,可以解决日常99%的问题

1、基本命令 uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件(SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息arch 显示机器的处理器架构uname -m 显示机器的处…

【代码编辑器】VS Code安装下载教程及后续基本配置(一)[小白看这一篇足够了,手把手教会]

前言 Visual Studio Code&#xff08;简称“VS Code” &#xff09;是Microsoft在2015年4月30日[Build]开发者大会上正式宣布一个运行于 [Mac OS X]、[Windows]和[ Linux]之上的&#xff0c;针对于编写现代[Web]和[云应用]的跨平台[源代码编辑器],可在桌面上运行&#xff0c;并…

打折:阿里云国外服务器价格购买优惠活动

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

【轮式平衡机器人】——角度/速度/方向控制分析软件控制框架

轮式平衡机器人具有自不稳定性&#xff0c;可类比一级倒立摆系统的控制方法&#xff0c;常见有反馈线性化方法、非线性PID控制、自适应控制、自抗扰控制&#xff0c;还有改进的传统缺乏对外界干扰和参数改变鲁棒性的滑模变结构控制。我们采用较为简单的双闭环PID控制实现平衡模…

指标异常检测和诊断

检测 是发现问题 诊断 是找到原因 误差的分类 系统误差&#xff1a;系统误差是由于仪器本身不精确&#xff0c;或实验方法粗略&#xff0c;或实验原理不完善而产生的。随机误差&#xff1a;随机误差是由各种偶然因素对实验者、测量仪器、被测物理量的影响而产生的。粗大误差&…

【C++】用wxWidgets实现多文档窗体程序

一、基本步骤和示例代码 在wxWidgets中&#xff0c;要实现多文档窗体程序&#xff0c;通常会使用wxMDIParentFrame和wxMDIChildFrame类来创建一种标准的MDI&#xff08;多文档接口&#xff09;应用。以下是基本步骤和示例代码&#xff0c;演示如何使用wxWidgets创建多文档界面…