队列Queue(买票上车)
队列我们可以看作是买票上车,遵循一个“先进先出”的一个原则。
操作:插入的操作叫 队尾入队(EnQueue)
删除的操作叫 对头出队(DeQueue)
队列的顺序存储
队列的存储结构是由 一维数组来实现的。
一个记录 队列头元素的位置的变量 Front
一个记录 队列尾元素的位置的变量 Rear
struct Queue{
ElementType *Data;//存储元素的数组//
int Front,Rear;//初始化让它们指向同一处//
int Size;//队列中元素的个数//
int MaxSize;//队列中最大的容量//
};
创建空队列
struct Queue*CreatQueue(int MaxSize){
struct Queue*Q;
Q=(struct Queue*)malloc(sizeof(struct Queue));
Q->Data=malloc(sizeof(ElementType)*MaxSize);
Q->Front=Q->Rear=0;
Q->Size=0;
Q->MaxSize=MaxSize;
return Q;
}
当Rear走到容量的末端的时候,还能入队吗?可以,Rear可以折返。
//无论是入队还是出队,Front与Rear总是从小到大的增长;
//若超过了数组的最大下标,Front与Rear折返回到下标0;
//队列为空或满的时候,Front与Rear都指向同一处,所以我们只用他们指向同一处来判断队列满是不严谨的。所以就体现了Size的作用。
还要注意小细节,Front所指的位置是有数据的,而Rear所指的位置是没有数据的(在未满的情况下);
入队EnQueue
将元素放入Rear位置,然后Rear+1;若+1后超过了最大下标,Rear的下标置为0;
void EnQueue(struct Queue*Q,int x){
if(Q->Size==Q->MaxSize)
pritf("Queue is full.\n");
return;
Q->Data[Q->Rear++]=x;
if(Q->Rear==Q==MaxSize)
Q->Rear=0;
}
出队DeQueue
EmlemenetType DeQueue(struct Queue*Q){
ElementType tmp;
if(Q->Size==0)
printf("Queue is Empty.\n");
return;
tmp=Q->Data[Q->Front++];
if(Q->Front==Q->MaxSize)
Q->Front=0;
return tmp;
}
队列的链式存储
亦可以用单链表来存储,这样链表的入队出队在链表两端进行。
在链表尾入队(就是线性表的尾插)
在链表头出队(删除第一个结点,即头结点后的结点)
struct QNode{
ElementType Data;
struct QNode*Next;
};
亦可使用双向链表来完成。