在C++语法中,队列的实现最常用的就是循环队列。
队列可描述为:(循环队列是顺序存储结构,其只能存储MaxSize-1个元素)
typedef struct{
ElemType2 data[MaxSize2];//数组,存储MaxSize2 -1个元素
int front, rear;//队头,队尾
}SqQueue;
下面是一些基本操作的说明:
初始状态(队空条件):Q.rear = Q.front = 0;
进队操作(队尾指针进1):Q.rear = (Q.rear + 1) % MaxSize
出队操作(队首指针进1):Q.front = (Q.front + 1) % MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
队满时:(Q.rear + 1) % MaxSize == Q.front
队空时:Q.rear == Q.front
如图所示
下面是代码实现(数组实现):
//循环队列操作
typedef struct{
ElemType2 data[MaxSize2];//数组,存储MaxSize2 -1个元素
int front, rear;//队头,队尾
}SqQueue;
//初始化
void InitQueue(SqQueue& Q)
{
Q.rear = Q.front = 0;
}
//判队空
bool isEmpty(SqQueue Q)
{
if (Q.rear == Q.front)//不必为0 只要队首指针和队尾指针相等即可
return true;
else
return false;
}
//入队
bool EnQueue(SqQueue &Q, ElemType2 x)
{
if((Q.rear + 1) % MaxSize2 == Q.front)//判断队列是否满
return false;
Q.data[Q.rear] = x;//赋值
Q.rear = (Q.rear + 1) % MaxSize2;//队尾指针进1
return true;
}
//出队
bool DeQueue(SqQueue& Q, ElemType2& x)
{
if (Q.rear == Q.front)//判队列空否
return false;
x = Q.data[Q.front];//FIFO
Q.front = (Q.front + 1) % MaxSize2;//队首指针进1
return true;
}