队列:

    只允许在一端进行插入操作,另一端进行删除操作的线性表

循环队列:

    队列的头尾相接的顺序存储结构称为循环队列

    front指向第一个元素,rear指向最后一个元素的下一个位置

    队空front==rear

    队空和队满的时候条件是一样的,我们有两种解决办法,首先是设置一个标识位,用来区别队空和队满的。其次是少用一个单元,即当只有一个单元的时候,我们就认为队满了。我们使用下一种方法,即牺牲一个单元格。

    队满:因为有以下两种情况,rear大于front和rear小于front,所以我们不能简单的使用rear+1==front来判断了,必须使用(rear+1)%QueueSize == front

    队长:同上,也是有两种情况,一种是rear大于front时(rear-front),另一种为rear小于front,(QueueSize-front+rear),所以通用的公式为(QueueSize-front+rear)%QueueSize

 

 

  1. #define MAXSIZE 40 
  2. typedef int ElemType; 
  3. typedef struct SqQueue{ 
  4.      ElemType data[MAXSIZE]; 
  5.      int front; 
  6.      int rear; 
  7. }SqQueue,*pSqQueue 
  8.  
  9. void initQueue(pSqQueuue pQ){ 
  10.      Q->front = 0; 
  11.      Q->rear = 0; 
  12.  
  13. int QueueLength(SqQueue Q){ 
  14.     return (Q.rear+MAXSIZE-Q.front)%MAXSIZE;//求队长  
  15.  
  16. bool EnQueue(pSqQueue pQ,ElemType e){ 
  17.     if((pQ->rear+1)%MAXSIZE)==pQ->front){//判断队满  
  18.         return false
  19.     } 
  20.     pQ->data[pQ->rear] = e; 
  21.     pQ->rear = (pQ->rear+1)%MAXSIZE;//尾指针移位  
  22.     return true
  23.  
  24. bool DeQueue(pSqQueue pQ,ElemType *e){ 
  25.     if((pQ->rear) == (pQ->front)){//判断队空  
  26.         return false
  27.     } 
  28.     *e = pQ->data[pQ->front]; 
  29.     pQ->front = (pQ->front+1)%MAXSIZE;//头指针移位  
  30.     return true