队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。
队列两种规定:
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;  //队头,初始0int 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);   //出队,先入先出,队头出#endifqueue.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;elsereturn 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;
} 结果
