数据结构:顺序循环队列

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

队列两种规定:

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

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

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

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

queue.h

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

#include 
#include 

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张图片

你可能感兴趣的:(数据结构)