逻辑结构
基本操作
- InitQueue(&Q)
- QueueEmpty(Q)
- EnQueue(&Q,x)
- DeQueue(&Q,&x)
- GetHead(Q,&x)
存储结构
1.顺序存储
1.1一般形式
- 数组形式
- rear、front双指针 int类型数组下标,front指向头部,rear只想尾部的下一个位置
- 操作:队不满时,新元素添加到队尾,队尾指针加1;队不空时,去除front值,front+1
- 判断:rear=front队为空,无法判断队列满
- 存在假溢出问题,会导致空间的浪费,因此设计循环队列。
1.2循环队列
- 使用取余运算,使得指针可以循环的使用空间。
- 判断:队空rear=front,队满:采用牺牲一个存储单元的方式,当front=(rear+1)%maxsize
2.链式存储
2.1一般形式
- 带有头指针和尾指针的链队列,rear指向最后一个元素//注意区别
//注意与堆栈数据结构的不同,因为含有两个指针所以需要多一层的封装
typedef struct
{
ElemType data;
struct LinkNode * next
}LinkNode;
typedef struct
{
LinkNode *front, *rear;
}LinkQueue;
- 判断:无头节点,front与rear都为NULL时为空,有头节点两者相等为空
- 为什么加上头节点:方便操作
- 优点:适于数据元素变动较大,同时不会产生溢出问题
2.2双端队列
- 两端都可以进行入队与出队的操作,分别叫前端和后端
- 输出/输出受限的双端队列:一端受到限制
- 常考题型:判断序列能否输出如何输出