顺序队

来源:互联网 发布:1936奥运会知乎 编辑:程序博客网 时间:2024/05/17 08:27

队列只允许在表的一端进行插入(队尾),在另一端进行删除(对头)的运算受限的线性表。


允许删除的一端称为对头(front),允许插入的一端称为队尾(rear)。
队列称为先进先出(First in first out)的线性表。

基本运算
InitQueue(Q)
构造一个空队列Qv

QueueEmpty(Q)
判断队空,若队列Q空,则返回true,否则返回false

QueueFull(Q)
判断队满,若队列为满,则返回true,否则返回false,此操作只适应线性表的队列。

EnQueue(Q,x)
入队,若队列Q非满,则将元素x插入Q的队尾。

DeQueue(Q)
出队,若队列Q非空,则删除Q的对头元素,并返回该元素。

QueueFront(Q)
若队列Q非空,则返回队头元素,注意不改变队列Q的状态。



队列必须使用一个变量保存队列的元素个数

由于队列的对头和队尾的位置是变化的,因此我们设置两个指针front和rear分别指示对头元素和队尾元素在队列中的位置,他们的初值为0

入队时将新元素插入到rear所指向的位置,然后将rear加1

出队的时候,返回front所指的元素,然后将front加1

在非空的队列中,头指针始终指向对头元素,而尾指针始终指向最后一个元素+1的位置。
当头尾指针相等时,队有可能为空,有可能为队满 。
队空和队满都是用元素个数判断。
循环队列的取模运算
i=(i+1)%QUEUESIZE;



#include <stdio.h>

#define QUEUESIZE 100//队列的最大容量


typedefchar DataType;//保存的数据类型。


typedef  struct

{

    int nFront;//头指针,指向队头元素。

    int nRear;//尾指针,指向队尾元素的下一个位置

   int nCount;//计数器。

   DataType data [QUEUESIZE];

}CirQueue;



void InitQueue(CirQueue *Q);

int QueueFull(CirQueue *Q);

void EnQueue(CirQueue *Q ,DataType x);

int QueEmpty(CirQueue *Q);

DataType *DeQueue(CirQueue *Q);

int main(int argc,constchar * argv[])

{

   CirQueue queue;

   InitQueue(&queue);

   QueEmpty(&queue);

    

     return0;

}


void InitQueue(CirQueue *Q)//初始化队

{

    Q->nFront=0;

    Q->nRear=0;

    Q->nCount=0;

    

}


int QueEmpty(CirQueue *Q)//判断队空。

{

   return Q->nCount==0;

}

int QueueFull(CirQueue *Q)//判断队满。

{

   return Q->nCount==QUEUESIZE;

}

void EnQueue(CirQueue *Q ,DataType x)//进队。

{

   if (QueueFull(Q))

    {

       printf("队已满");

       return;

    }

    

    

        Q->nCount++;

    Q->data[Q->nRear]=x;

    Q->nRear=(Q->nRear+1)%QUEUESIZE;

 

    

}


DataType *DeQueue(CirQueue *Q)

{

   if (QueEmpty(Q))

    {

       printf("队为空!");

       returnNULL;

    }

   staticDataType temp;

    temp=Q->data[Q->nFront];

    Q->nCount--;

    Q->nFront=(Q->nFront+1)%QUEUESIZE;

   return &temp;

    

}

 DataType Quefront(CirQueue *Q)

{

   return Q->data[Q->nFront];

}



原创粉丝点击