学习线性表,高深又烧脑?莫怕,手把手教你终结烦恼!(队列:顺序存储结构(一))

Long time no see.不知道为什么,可能因为最近事情比较多,也可能是因为我自己的懒惰(小伙伴们不要学我),我竟然将近20天没有更新我的博客了,想必长时间没有打理,它已经发霉长蘑菇了叭。长时间的停工会让我一一种全新的,更饱满的热情投入到博客的写作中来,希望大家也可以多给我点几个给力的赞,或者小小的打赏,嘿嘿。

上次我们讲完了栈,简单回顾一下,栈的特点是什么?

后进先出(先进后出)。Well done!

那么,今天我们学习一种新的线性表,性质和栈相反,那就是   队列!

为什么说队列的性质和栈相反呢?因为队列的数据存储是先进先出的。

一个最常见,最简单的例子,我们排队买早点的时候,总是队头的人买完东西从队头直接离开,新来的人总是站在队尾开始排队,直到前面所有的人都买完早点,才能轮到自己。简单地说,先来的人买完东西就直接走了(先进先出),后来的人不排完队买完东西就不会离开(后进后出)。而且通过这个我们也可以发现,队列的元素的插入和删除分别是在队列的两端,插入在队尾,删除在队头。而我们的老朋友——栈,只能在同一端进行插入和删除。

对于队列的学习,我们首先来接触队列的顺序存储结构。由于需要在队列的两端进行操作,所以需要两个指示标记。队头的我们记为front,队尾的我们记为rear。队列的工作过程就是不停地在队头(front)删除元素和在队尾(rear)插入元素。当队列为空时,我们人为规定front和rear的值都为-1。

如图所示为一个顺序队列的操作示意图,其中MaxSize=5.初始时front=rear=-1.从图中可以清楚地看到,队空的条件为front==rear,有元素加入队列时队尾标记rear总是+1,有元素从队列离开时队头标记front也总是+1。队满的条件是rear指向最大下标,即rear==MaxSize-1。

学习线性表,高深又烧脑?莫怕,手把手教你终结烦恼!(队列:顺序存储结构(一))_第1张图片

有了这些知识的铺垫,相信大家对队列已经有了比较清楚的认识,可以贴代码了:

#include
#include
#include
#define MaxSize 50
typedef char ElemType;
typedef struct{
    ElemType data[MaxSize];
    int front,rear;//front指向队头,rear指向队尾。
}SqQueue;
void InitQueue(SqQueue* q){//初始化队列。
    q->front=q->rear=-1;//设为初始状态,即front==rear==-1。
}
void DestroyQueue(SqQueue* q){//销毁队列。
    free(q);//释放队列q占用的存储空间。
}
bool QueueEmpty(SqQueue* q){//判断队列是否为空。
    return q->front==q->rear;//队空条件:front==rear。
}
bool enQueue(SqQueue* q,ElemType e){//加入队列。
    if(q->rear==MaxSize-1)return false;//若队列满了,则返回false。
    q->rear++;//队尾增1。
    q->data[q->rear]=e;//元素e插入队尾位置。
    return true;
}
bool deQueue(SqQueue* q,ElemType* e){//出队。
    if(q->front==q->rear)return false;//若队列为空,则返回false。
    q->front++;//队头+1。
    *e=q->data[q->front];//取出队头元素。
    return true;
}

细心的同学可能会发现,队列中的front只增不减,所以当rear指向队列的最后一个空位的时候,队列虽然已经“满”了,可是队头还留有空位,这就造成了空间上的浪费,我们把它称为“假溢出”。对于这种情况,我们可以简单地对顺序队列进行改造一下即可改进。欲知后事如何,请听下回分解。欢迎留言交流!

你可能感兴趣的:(数据结构,数据结构,c语言)