循环队列
1.队列的定义
队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表 队尾(rear)——允许插入的一端 队头(front)——允许删除的一端 队列特点:先进先出(FIFO)
2. 循环队列
循环队列是队列的一种顺序表示和实现方法。 用一组地址连续的存储单元依次存放从队头到队尾的元素
3.初始化循环队列
3.1数据结构
typedef struct {
ElemType data[MaxSize];//储存MaxSize减一个元素
int front, rear;//队列头和队列尾
}SqQueue;
3.2 定义空队列
void InitSqQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
4.入队
4.1算法思想
-
判断队列是否满,栈满无法入队列
-
当Q.rear与Q.front相差一个单位时 队列满
-
-
rear是从零开始递增的,当rear=Maxsize-1时,再进行入队操作,会使得rear 指向0,此时用普通的 rear自增已经无法实现该操作
-
所以使用Q.front等于(Q.rear + 1) % MaxSize
-
所以栈满条件为(Q.rear+1)%MaxSize 等于 Q.front
4.2算法设计
bool EnQueue(SqQueue& Q,ElemType e)
{
if((Q.rear+1)%MaxSize == Q.front)
{
return false;//栈满
}
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
5.出队
5.1算法思想
-
判断队列是否为空,为空则不能出队
-
队列为空的条件为 Q.front等于Q.rear
-
-
与入队同理 当出队时,要将(Q.front + 1) % MaxSize赋于Q.front
5.2算法设计
bool DeQueue(SqQueue& Q)
{
if(Q.front==Q.rear)
{
return false;
}
Q.front = (Q.front + 1) % MaxSize;
}
标签:队列,SqQueue,入队,MaxSize,循环,front,rear
From: https://www.cnblogs.com/wlb429/p/16763886.html