数据结构--队列
队列是只允许在表的一端进行插入(队尾),在另一端进行删除(对头)的运算受限的线性表。
允许删除的一端称为对头(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;
顺序队#define QUEUESIZE 100typedef char DataType;typedef struct{int nFront; //头指针int nRear; //尾指针int nCount; //计数器DataType data[QUEUESIZE];}CirQueue;
初始化void InitCQ(CirQueue *c){ c->nCount=0; c->nFront=0; c->nRear=0;}判断队空int QueueEmply(CirQueue *q){return q->nCount==0;}判断队满bool QueueFull(CirQueue *q){return q->nCount==QUEUESIZE;}入队bool EnQueue(CirQueue *p,DataType _data){if(QueueFull(p))return false;p->nCount++;p->data[p->nRear]=_data;p->nRear=(p->nRear+1)%QUEUESIZE;return true;}出队bool DeQueue(CirQueue *p,DataType *data){if(QueueEmpty(p))return false;*data=p->data[p->nFront]; p->nFront=(p->nFront+1)%QUEUESIZE;p->nCount--;return true;}取队头元素DataType QueueFront(CirQueue *p){if(QueueEmpty(p))return -1;return p->data[p->nFront];}链队typedef char DataType;typedef struct Node{Datatype data;struct Node *next;}QueueNode;typedef struct queue{QueueNode *front;QueueNode *rear;}LinkQueue;
初始化void InitQueue(LinkQueue *Q){Q->front=Q->rear=NULL;}
判断队空int QueueEmpty(LinkQueue *Q){return Q->front==NULL;}
入队void EnQueue(LinkQueue *Q,DataType x){QueueNode *p=(QueueNode *)malloc (sizeof(QueueNode));p->data=x;p->next=NULL;if(QueueEmpty(Q))Q->front=Q->rear=p;else{Q->rear->next=p;Q->rear=p;}}
出队DataType DeQueue(LinkQueue *Q){DataType x;QueueNode *p;if(QueueEmpty(Q))return -1;p=Q->front;x=p->data;Q->front=p->next;if(Q->rear==p)Q->rear=NULL;free(p);return x;}
取队头元素DataType QueueFront(LinkQueue *Q){if(QueueEmpty(Q))return -1;return Q->front->data;}