c语言数据结构学习心得——队列

队列

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

队头(Front):允许删除的一端(队首)

队尾(Rear):允许插入的一端

FIFO:先进先出

    不要求从数组首位开始存储队列

#define MaxSize 50  //定义队列中元素的最大个数
typedef struct{
    ElemType data[MaxSize];  //存放队列元素
    int front,rear;  //队头指针和队尾指针
}SqQueue;

循环队列

其中,首尾相连的顺序存储的队列叫循环队列

入队:rear=(rear+1)%MaxSize

出队:front=(front+1)%MaxSize

队空:front=rear

队满:数组中仍有一个空余单元

队满时:(rear-front+MaxSize)%MaxSize

1.入队

bool EnQueue(SqQueue &Q,ElemType x){
    if((Q.rear+1)%MaxSize==Q.front) return false;//队满
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}

2.出队

bool DeQueue(SqQueue &Q,ElemType &x){
    if(Q.rear==Q.front) return false;//队满
    x=Q.data[Q.front];
    Q.rear=(Q.front+1)%MaxSize;
    return true;
}

链式队列

typedef struct{  //链式队列结点
    ElemType data;  
    struct Link Node *next;  
}Link Node;

typedef struct{  //链式队列
    ElemType data;  
    Link Node *front,*rear;//队头和队尾指针
}Link Queue;
 

1.入队

void EnQueue(LinkQueue &Q,ElemType x){
    s=(LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=NULL;
    Q.rear->next=s;
    Q.rear=s;
}

2.出队

bool DeQueue(LinkQueue &Q,ElemType &x){
   if(Q.front==Q.rear) return false;  //空队
   p=Q.front->next;
   x=p->data;
   Q.front->next=p->next;
   if(Q.rear==p) Q.rear=Q.front;  //原队列只有一个结点删后变空队
   free(p);
   return true;
}

双端队列

具体见上传图片

总结

猜你喜欢

转载自www.cnblogs.com/suprechen/p/10597491.html