1.描述:队列也是一种表,遵循先进先出的规则(FIFO)。
队列头称为队头(front),可以取出元素,队列尾称为队尾(rear),允许插入元素。
2.队列的实现
链表实现和数组实现
对于链表实现来说,和栈类似,所有链表的操作都是合法的
主要看队列的数组实现
3.队列ADT
以上是队列支持的接口
4. 链表实现
队列可以看作由链表派生出来的子类
简单地调用链表中的一些接口即可实现队列接口。略。
5.数组实现
数组实现队列的本质是创建一系列变量对数组的属性进行跟踪
1 struct QueueRecord 2 { 3 int Capacity; 4 int Front; 5 int Rear; 6 int Size; 7 ElementType *Array; 8 };
检测队列是否为空:
1 int IsEmpty(QueueRecord *Q) 2 { 3 return Q->Size==0; 4 }
构造空队列:
1 void MakeEmpty(QueueRecord *Q) 2 { 3 Q->Size=0; 4 Q->Front=1; 5 Q->Rear=0; 6 }
循环数组:数组是大小固定的,所以,只要不断向列表中添加元素,数组肯定会有满的时候,这时候就需要用到循环数组。
循环数组的Front和Rear,只要到达数组末尾,旋即绕回数组头部。
入队:
1 static int Succ(int Value,QueueRecord *Q) 2 { 3 if(++Value==Q->Capacity) 4 Value=0; 5 return Value; 6 } 7 8 void Enqueue(ElementType X,QueueRecord *Q) 9 { 10 if(IsFull(Q)) 11 Error("Full Queue"); 12 else 13 { 14 Q->Size++; 15 Q->Rear=Succ(Q->Rear,Q); 16 Q->Array[Q->Rear]=X; 17 } 18 }
6.队列的应用
略。
参考资料【1】《数据结构(C++语言版)》 邓俊辉
【2】《数据结构与算法分析——C语言描述》 Mark Allen Weiss