数据结构——队列

222 阅读2分钟

这是我参与更文挑战的第13天,活动详情查看:更文挑战

队列

只允许在表的一端插入另一端删除。

队头:允许删除的一端 队首

队尾:允许插入的一端

常见操作:初始化 判队列空 入队 出队 读对头元素

队列的顺序表示

队头指针指向队头元素,队尾指针指向队尾元素的下一个位置

#define MaxSzie 50
typedef struct{
    Elemtype data[MaxSize];
    int front ,rear;
}SqQueue;
  • 初始状态:Q.front == Q.rear == 0
  • 进队操作:队不满时,先送值到队尾元素,再将队尾指针加1
  • 出队操作:队不空时,先取队头元素值,再将队头指针加1

循环队列

  • 初始时:Q.front = Q.rear = 0
  • 队首指针进1 :Q.front = (Q.front + 1) %MaxSize
  • 队尾指针进1: Q.rear = (Q.rear + 1)%MaxSize
  • 队列长度: (Q.rear + MaxSize - Q.front)% MaxSize

类型中增设表示元素元素个数的数据成员

  • 队空条件:Q.sise == 0
  • 队满条件:Q.size == MaxSize

两者均有 Q.rear == Q.front

类型中增设tag数据成员,tag==0时,若因为删除使Q.front == Q.rear 队空;tag == 1时,若因为插入使Q.front == Q.rear 队满

//初始化
void InitQueue(SqQueue &Q){
    Q.rear = Q.front = Q;
}
//判断队列为空
bool isEmpty(SqQueue Q){
    if(Q.rear == Q.front) return true;
    return false; 
}
//入队
bool EnQueue(SqQueue &s,Elemtype x){
    if((Q.rear+1)%MaxSize ==Q.front)return false;
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1)%MaxSize;
    return true;
}
//出队
bool DeQueue(SqQueue &s,Elemtype x){
    if(Q.rear == Q.front)return false;
    //有问题 队满时没法用
    x= Q.data[Q.front];
    Q.front = (Q.front+1)%MaxSize;
    return true;
    }

队列的链式存储

链式特别适合用在数据元素数量很大的时候

一个同时具有队头指针和队尾指针的单链表

typedef struct{
    Elemtype data;
    struct LinkeNode *next;
}LinkNode;
typedef struct{
    LinkNode *front,*rear;
}LinkQueue;

Q.front ==NULLQ.rear ==NULL时,链式队列为空

  • 出队时,首先判断队是否为空,若不空则取出队头元素,并让Q.front指向下一个节点
    • 若该结点为最后一个结点,则置Q.front Q,rear均为NULL
  • 入队时,建立一个新结点插入,并让Q.rear指向新结点
    • 若原队列为空,让Q,front指向新结点

很麻烦!,加一个头结点

//初始化
void InitQueue(LinkQueue &Q){
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    Q.front -> next = NULL;
}
//判断队列为空
bool IsEmpty(LinkQueue Q){
    if(Q.front == Q.rear) return true;
    return false;
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    s->data = x;
    s->next = null;
    Q.rear->next = s;
    Q.rear = s;
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(Q.front == Q.rear)return false;
    LinkNode *p=Q.front->next;
    x = p->data;
    Q.front->next =p->next;
    if(Q.rear == p)Q.rear = Q,front;
    free(p);
    return true; 
}

双端队列

两端都可以入队和出队操作

输出受限的双端队列:允许一端插入和删除,只允许另一端插入