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