队列是限制在两端进行插入操作和删除操作的线性表
允许进行存入操作的一端称为队尾
允许进行删除操作的一端称为队头
当线性表中没有元素时,称为空队
特点:先进先出
sequeue.h
#ifndef SEQUEUE_H
#define SEQUEUE_H
typedef int data_t;
#define N 100
typedef struct
{
data_t data[N];
int front;
int rear;
}sequeue;//给结构体类型起一个别名
sequeue *sequeue_creat();
int enqueue(sequeue *sq,data_t value);
data_t dequeue(sequeue *sq);
int queue_empty(sequeue *sq);
int queue_full(sequeue *sq);
int queue_clear(sequeue *sq);
sequeue *queue_free(sequeue *sq);
#endif
sequeue.c
#include <stdio.h>
#include "sequeue.h"
#include <stdlib.h>
#include <string.h>
sequeue *sequeue_creat(){//创建队列
sequeue *sq;
sq=(sequeue *)malloc(sizeof(sequeue));
if(sq==NULL){
return NULL;
}
memset(sq->data,0,sizeof(sq->data));
sq->front=sq->rear=0;
return sq;
}
int enqueue(sequeue *sq,data_t value){//入队
if(sq==NULL)
return -1;
if((sq->rear+1)%N==sq->front){
printf("sequeue is full\r\n");
return -1;
}
sq->data[sq->rear]=value;
sq->rear=(sq->rear+1)%N;
return 0;
}
data_t dequeue(sequeue *sq){//出队
data_t ret;
ret=sq->data[sq->front];
sq->front=(sq->front+1)%N;
return ret;
}
int queue_empty(sequeue *sq){//判断队列是否为空,队头与队尾下标重合
return (sq->front==sq->rear ? 1:0);
}
int queue_full(sequeue *sq){
return (sq->front==(sq->rear+1)%N ? 1:0);
}
int queue_clear(sequeue *sq){//判断队列是否满
sq->front=sq->rear=0;
return 0;
}
sequeue *queue_free(sequeue *sq){//释放队列
free(sq);
sq=NULL;
return NULL;
}