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