队列是我们常见的排队序列,先来先得,顺序队列的实现是通过一片连续的存储空间去实现,并且拥有两个指针一个是front,一个是rear,分别指向队头和队尾,注意顺序队列难就难在这里,如何去判断队列的满与空有着不同的方法。例如将rear是否指向的是当前数据的下一个位置还是说指向当前位置,front亦同,不同的情况所要做的操作则大为不同。
队列的定义
typedef struct
{
int data[maxsize];
int front, rear;//分别指向队头和队尾
}SqQueue;
定义一个结构体,包含一个元素数组和一个头指针及尾指针。
队列的初始化
//队列的初始化
int InitQueue(SqQueue &Q)
{
Q.front = 0;//队头先用后加
Q.rear = 0;//队尾先加后赋值
return 1;
}
首先将头指针和尾指针指向同一个位置
队列的判空
//队列的判空
int IsEmptyQueue(SqQueue Q)
{
if
(Q.front == Q.rear)return 1;
else
return 0;
}
如果front与rear相等,则队列空
队列的入队
//队列的入队
int PushQueue(SqQueue& Q, int e)
{
if ((Q.rear + 1) % maxsize == Q.front)return 0;//判断队满
Q.data[Q.rear] = e;//牺牲掉一个空间
Q.rear = (Q.rear + 1) % maxsize;
return 1;
}
首先判断队列是否满,设想如果单纯用rear与maxsize去比,则无法解决问题,当front开始移动的时候原本头部就位置空了,也就是还可以继续输入数据,所有要通过循环来控制指针,所以判断队列满的条件就是将rear+1取余maxsize若等于front则队列满,这需要牺牲掉一个空间。然后赋值rear循环加1。
队列的出队
//队列的出队
int PopQueue(SqQueue& Q, int& e)
{
if (Q.rear == Q.front)return 0;//表示队列空
e = Q.data[Q.front];
Q.front = (Q.front + 1) % maxsize;
return 1;
}
首先判断队列是否空,若空直接返回结束。否则,将头指针的数据输出,然后front+1对maxsize循环取余。
队列的判满
//队列的判满
int IsQueueFull(SqQueue Q)
{
if ((Q.rear + 1) % maxsize == Q.front)return 1;
return 0;
}
就是入队操作去掉了入队的过程。
求队头元素
//求队头元素
int GetTop(SqQueue Q,int &e)
{
if (Q.front == Q.rear)return 0;//队空
e = Q.data[Q.front];//只返回值不改变队头
return 1;
}
首先判断是否为空,将头部元素返回,但不改变指针的值。