数据结构:顺序循环队列

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

队列两种规定:

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;
} 

结果

相关推荐

  1. 数据结构——顺序队列(循环)

    2024-01-22 05:22:03       34 阅读
  2. 数据结构 / 队列 / 循环队列 / 入队列和出队列

    2024-01-22 05:22:03       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-22 05:22:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-22 05:22:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-22 05:22:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-22 05:22:03       20 阅读

热门阅读

  1. Hbase 与 ElasticSearch 的结合使用

    2024-01-22 05:22:03       31 阅读
  2. K8s常用命令

    2024-01-22 05:22:03       36 阅读
  3. Windows.h中的函数有哪些?

    2024-01-22 05:22:03       46 阅读
  4. C++轮子 · STL关联容器

    2024-01-22 05:22:03       40 阅读
  5. 如何将一个字符串转换为整数?

    2024-01-22 05:22:03       37 阅读
  6. helm Charts模板指南

    2024-01-22 05:22:03       35 阅读