1.顺序存储的队列的定义
物理存储空间为一片连续的内存空间。
#define MaxSize 10
//顺序队列的定义
typedef struct SqQuene
{
int data[MaxSize];
int front, rear;//队头队尾指针;队尾指针指向接下来要插入数据元素的位置。
};
2. 顺序队列的初始化
//顺序队列的初始化
void InitQuene(SqQuene &Q)
{
//rear指针指向队尾元素后一个位置,front指针指向队头元素
Q.front = Q.rear = 0;
}
3. 判断是否为空队列
//判断是否为空队列
bool QueneEmpty(SqQuene Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
4. 判断是否为满队列
//判断是否为满队列
bool QueneFull(SqQuene Q)
{
if ((Q.rear + 1) % MaxSize == Q.front)
return true;
else
return false;
}
5. 顺序队列的入队
//顺序队列的入队
bool EnQuene(SqQuene &Q, int x)
{
//if (Q.rear == MaxSize)//注意队列不能只根据队尾判断队列满了,而是要根据队头和队尾共同判断队列是否满了
// return false;
//因此需要通过队尾和队头共同判断队列是否满了,特别是对于循环队列。
if ((Q.rear + 1) % MaxSize == Q.front)
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
6. 顺序队列的出队
//顺序队列(循环队列)的出队
bool Dequene(SqQuene &Q, int &x)
{
if (Q.front == Q.rear)
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;//为了保证front指针和rear指针转圈圈移动
return true;
}
7.获得队头元素
//获得队头元素
bool GetHead(SqQuene &Q, int &x)
{
if (Q.front == Q.rear)
return false;
x = Q.data[Q.front];
return true;
}
8. 求解队列元素个数
//求解队列元素个数
bool GetEle(SqQuene &Q, int &x)
{
if (Q.front == Q.rear)
return false;
//Q.rear-Q.front+MaxSize是为了防止Q.front循环到Q.rear之后
x = (Q.rear + MaxSize - Q.front) % MaxSize;
return true;
}
9. 添加辅助变量来区分队列满和队列空
上述要求Q.rear与Q.front之间存在一个不可存放的内存区域;如果不希望存在这个区域的话,可以通过添加辅助变量,例如size记录队列的长度,tag记录队列最近的一步是入队还是出队操作,从而判断队列是满的还是空的。