- 队列元素先进先出
- 队列只允许在线性表的一端进行操作,是一种操作受限的线性表
队列的基本操作
- InItQueue(&Q)初始化队列,构造一个空队列 Q
- EmptyQueue(Q)队列判空
- FullQueue(Q)队列判满
- EnQueue(&Q , x)入队操作
- DeQueue(&Q , &x)出队操作
- GetQueue(Q, &x)获取队头元素
队列的顺序存储
- 用‘以数组实现的顺序表’来实现队列的顺序存储
- 设置两个指针
- 队头指针 front:指向队头元素
- 队尾指针 rear:指向队尾元素的下一个位置
#define MaxSize 100
typedef struct{ElemType data[MaxSize];int front,rear;
}SqQueue;
使用顺序存储存在的问题:
- 当队列为空时 frontrear,但是,当队列存满元素 又全部出队后,此时队列为空,frontrear。但是此时两个指针已经到了数组最后,无法继续向后移动,此时数组为空也无法继续插入新元素。如果继续插入新元素,就会“假溢出”,假溢出就是数组中仍然有可以继续存入新数据的空位置,但无法继续插入了。
- 当队列满时,rear+1MaxSize,如上图 4,当队列只有一个元素时,也是rear+1MaxSize
循环队列
为了解决上面顺序队列的问题,可以使用循环队列
- 队空:rear==front
- 队满:(rear+1)%MaxSize==front
- 队列元素个数:(rear-front+MaxSize)%MaxSize
判断队列空与满的其他方式:
- 定义队列类型时增加 size 变量表示元素个数。删除成功 size 减 1,插入成功 size 加 1。队空时 size0,队满时 size=MaxSize;两种情况都有 frontrear
- 定义队列类型时增加 stag 变量。删除一个元素时 tag=0,插入一个元素时 tag=1。当 rearfront 时,如果 tag0,就是队空,如果 tag==1,就是队满