队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间(类似于数组),并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。另一个要素为队列最大容量(MaxSize)。下面是其C++具体实现。
1.队列的定义
typedef struct Queue
{
DataType queue[MaxSize]; //DataType为队列数据类型,可以为int/char等,MaxSize为队列最大容量
int front; //队头指针(非指针变量,指示位置)
int rear; //队尾指针
}SeqQueuue;
2.队列的初始化
SeqQueue *SQ=new SeqQueu; //动态分配创建队列
DataType data; //确定队列存放数据类型
void InitQueue(SeqQueue *SQ)
{
if(!SQ) return;
SQ->front=SQ->rear=0;
}
3.判断队列是否为满
int IsFull(SeqQueue *SQ)
{
if(!SQ) return 0;
if(SQ->rear==MaxSize)
{
return 1;
}
return 0;
}
4.判断队列是否为空
int IsEmpty(SeqQueue *SQ)
{
if(!SQ) return 0;
if(SQ->front==SQ->rear)
{
return 1;
}
return 0;
}
5.入队,将元素data插入到队列SQ中
int EnterQueue(SeqQueue *SQ,DataType data)
{
if(!SQ) return 0;
if(IsFull(SQ))
{
return 0; //插入失败
}
SQ->queue[SQ->rear]=data;
SQ->rear++;
return 1;
}
6.出队,将元素data移除
int DeleteQueue(SeqQueue *SQ,DataType *data)
{
if(!SQ||IsEmpty) return 0;
if(!data) return 0;
*data=SQ->queue[SQ->front];
for(int i=SQ->front+1;i<SQ->rear;i++)
{
SQ->queue[i-1]=SQ->queue[i];
}
SQ->rear--;
return 1;
}
7.出队(另一种方法)
int DeleteQueue2(SeqQueue *SQ,DataType *data)
{
if(!SQ||IsEmpty) return 0;
*data=SQ->queue[SQ->front];
SQ->front=(SQ->front)+1;
return 1;
}
8.获取队列元素中的个数
int getLength(SeqQueue *SQ)
{
if(!SQ) return 0;
return SQ->rear-SQ->front;
return 1;
}