队列

逻辑结构

  • FIFO
  • 线性结构:受限线性表

基本操作

  • 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双端队列

  • 两端都可以进行入队与出队的操作,分别叫前端和后端
  • 输出/输出受限的双端队列:一端受到限制
  • 常考题型:判断序列能否输出如何输出

你可能感兴趣的:(队列)