循环队列
1.队列的定义
队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表 队尾(rear)——允许插入的一端 队头(front)——允许删除的一端 队列特点:先进先出(FIFO)
2. 循环队列
循环队列是队列的一种顺序表示和实现方法。 用一组地址连续的存储单元依次存放从队头到队尾的元素
3.初始化循环队列
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.rear=(Q.rear + 1) % MaxSize,既满足单纯的自增,也满足循环从MaxSize-1到0
-
所以栈满条件为(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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通