队列(Queue)是只容许在一端进行插入,而在另外一端进行删除的运算受限的线性表html
容许删除的一端称为队头(Front)。web
容许插入的一端称为队尾(Rear)。算法
当队列中没有元素时称为空队列。
测试
队列的修改是依先进先出的原则进行的。动画
新来的成员老是加入队尾(即不容许"加塞"),每次离开的成员老是队列头上的(不容许中途离队),即当前"最老的"成员离队。ui
(1)InitQueue(Q)spa
置空队。构造一个空队列Q。(2)QueueEmpty(Q)3d
判队空。若队列Q为空,则返回真值,不然返回假值。(3) QueueFull(Q)指针
判队满。若队列Q为满,则返回真值,不然返回假值。(4) EnQueue(Q,x)code
若队列Q非满,则将元素x插入Q的队尾。此操做简称 入队。(5) DeQueue(Q)
若队列Q非空,则删去Q的队头元素,并返回该元素。此操做简称 出队。(6) QueueFront(Q)
若队列Q非空,则返回队头元素,但不改变队列Q的状态。#define MaxQSize 100 //应根据具体状况定义该值 typedef char QElemType; //QElemType的类型依赖于具体的应用 typedef struct { QElemType * base; //初始化的动态分配存储空间 int front; //头指针,队非空时指向队头元素 int rear; //尾指针,队非空时指向队尾元素的下一位置 }CirQueue;
if(i+1 == MaxQSize) // i 表示front或rear i=0; else i++;
i = (i+1) % MaxQSize;
bool InitQueue(CirQueue * Q) { Q->base = (QElemType *)malloc(MaxQSize * sizeof(QElemType)); if(!Q->base) exit(OVERFLOW); //分配内存失败 Q->front = Q->rear = 0; //初始化为空栈 return true; }
bool QueueEmpty(CirQueue * Q) {//由于少用一个元素,因此只有空队列才有 front = rear if (Q->front == Q->rear) { return true; } else return false; }
bool QueueFull(CirQueue * Q) {//若是插入后尾指针的位置等于头指针的位置,则说明队列满了 if ((Q->rear + 1) % MaxQSize == Q->front) { return true; } else return false; }
bool EnQueue(CirQueue * Q, QElemType e) {//插入元素e if (QueueFull(Q)) {//若是队满,则返回false return false; } Q->base[Q->rear] = e; //插入元素 Q->rear = (Q->rear + 1) % MaxQSize; //修改尾指针 return true; }
bool DeQueue(CirQueue * Q, QElemType * e) { if (QueueEmpty(Q)) {//若是队空,则返回false return false; } *e = Q->base[Q->front]; //返回元素值 Q->front = (Q->front + 1) % MaxQSize; //修改头指针 }
typedef struct QNode { QElemType data; //数据域 struct QNode * next; //指针域 }QNode, *QueuePtr; typedef struct { QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }LinkQueue;
bool InitQueue(LinkQueue * Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));//建立头结点 if (!Q->front) {//若是内存分配失败 exit(OVERFLOW); } Q->front->next = NULL; //初始化空队列 return true; }
bool DestroyQueue(LinkQueue * Q) { while(Q->front) { Q->rear = Q->front->next;//用rear暂时存储新的队头指针 free(Q->front); //释放内存 Q->front = Q->rear; } return true; }
bool EnQueue(LinkQueue * Q, QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//为新元素分配内存 if (!p) { exit(OVERFLOW); } p->data = e; //初始化新结点 p->next = NULL; Q->rear->next = p; //修改尾指针 Q->rear = p; return true; }
bool DeQueue(LinkQueue * Q, QElemType * e) { if (Q->front == Q->rear) {//若是队空 return false; } QueuePtr p = Q->front->next; //保存第一个结点的位置 *e = p->data; Q->front->next = p->next; //第一个结点出队 if (Q->rear == p) {//若是只有一个结点,置为空队 Q->rear = Q->front } free(p); return true; }