队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头
只能在一端插入,一端删除 ,先进先出,后进后出
队列的顺序存储结构通常由一个一维数组和记录队列头元素位置的变量front以及记录队列尾元素位置的变量rear组成
我们采用循环队列 ,这种队列对于n个元素的数组,只用了n-1个位置 ,并且规定front与rear相等时,队列空,且 rear不能加到front那个位置,所以少用了一个元素 。
//刚开始时,当队列空时,front和rear都为-1,当新增一个结点时,rear加1,front不变;当删除一个结点时,front加1,rear不变
//也就是说front实际上指向队列的头一个结点的再前面一个
//rear指向队列的最末尾元素
#include <stdio.h>
#include <malloc.h>
#define MaxSize <存储数据元素的最大个数>
//队列(Queue)是具有一定操作约束的线性表
//只能在一端插入,一端删除 ,先进先出,后进后出
//队列的顺序存储结构通常由一个一维数组和记录队列头元素位置的变量front以及记录队列尾元素位置的变量rear组成
struct QNode{
ElementType Data[MaxSize];
int front;
int rear;
};
typedef struct QNode *Queue;
//刚开始时,当队列空时,front和rear都为-1,当新增一个结点时,rear加一,front不变;当删除一个结点时,front加一,rear不变
//也就是说front实际上指向队列的头一个结点的再前面一个
//rear指向队列的最末尾元素
//我们采用循环队列 ,这种队列对于n个元素的数组,只用了n-1个位置 ,因为规定front与rear相等时,队列空,且 rear不能加到front那个位置,所以少用了一个元素
//入队列
void AddQ(Queue PtrS,ElementType item)
{
if((PtrS->rear+1)%MaxSize==PtrS->front){
printf("队列满了");
return;
}
PtrS->rear=(PtrS->rear+1)%MaxSize;//这是取余操作,最多只能与MaxSize相同大小,那么取余为0,其它的相当只是加1而已
PtrS->Data[PtrS->rear]=item;
}
//出队列
ElementType DeleteQ(Queue PtrQ)
{
if(PtrQ->front==PtrQ->rear)
{
printf("队列空");
return ERROR;
}else{
PtrQ->front=(PtrQ->front+1)%MaxSize;
return PtrQ->Data[PtrQ->front];
}
}