循环队列

循环队列

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算法思想

  1. 判断队列是否满,栈满无法入队列

    1. 当Q.rear与Q.front相差一个单位时 队列满

  2. rear是从零开始递增的,当rear=Maxsize-1时,再进行入队操作,会使得rear 指向0,此时用普通的 rear自增已经无法实现该操作

  3. 所以使用Q.rear=(Q.rear + 1) % MaxSize,既满足单纯的自增,也满足循环从MaxSize-1到0

  4. 所以栈满条件为(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算法思想

  1. 判断队列是否为空,为空则不能出队

    1. 队列为空的条件为 Q.front等于Q.rear

  2. 与入队同理 当出队时,要将(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;
}
 
posted @   骆宾王  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示