队列

队列(queue)是一种先进先出的、操作受限的线性表。

队列概念图

ADT 队列 (Queue)
Data
    同线性表,但元素只能队尾入,对头出。
Operation
    init_queue(*Q) :初始化操作,建立一个空队列Q。
    clear_queue(*Q) :将队列Q清空。
    queue_is_empty(Q) :若队列Q为空,返回true,否则返回false。
    enqueue(*Q,e) :若队列Q存在,插入新元素e到队列Q中并成为对尾元素 。
    dequeue(*Q,*e) :删除队列Q中队头元素,并用e返回其值。
endADT

和栈一样存储方式也分为顺序和链式。

链式队列实现

链式队列图

构建

#define OK      true
#define ERROR   false
typedef bool STATUS;
typedef int Elem_Type;

typedef struct Node
{
    Elem_Type data;
    struct Node *next;
}Node;

typedef struct CH_Queue
{
    Node *head;
    Node *tail;
}CH_Queue;
CH_Queue queue;

初始化

STATUS init_queue(CH_Queue *q)
{
    q->head = NULL; 
    q->tail = NULL;      
}

清空

STATUS clear_queue(CH_Queue *q)
{
    Node *temp = NULL;
    q->tail = NULL;
    while(q->head != NULL)
    {
        temp = q->head;
        q->head = q->head->next;
        free(temp);
    }
}

判空

bool queue_is_empty(CH_Queue q)
{
    if(q.head == NULL)
    {
        return true;
    }
    return false;
}

入队

STATUS enqueue(CH_Queue *q, Elem_Type e)\
{
    Node *temp = (Node *)malloc(sizeof(Node));
    temp->data = e;
    temp->next = NULL;
    if(q->tail == NULL)
    {
        q->head = q->tail = temp;
    }
    else
    {
        q->tail->next = temp;
        q->tail = temp;
    }
    return OK;
}

出队

STATUS dequeue(CH_Queue *q, Elem_Type *e)
{
    Node *temp = q->head;
    *e = q->head->data;
    q->head = q->head->next;
    free(temp);
    return OK;
}

顺序队列实现

由于顺序存储结构移动麻烦且无法动态扩容,因此要使用下标模拟指针从而模拟循环。

循环队列

构建

#define OK      true
#define ERROR   false
typedef bool STATUS;
typedef int ElemType;
#define MAX_SIZE    100

typedef struct SQQueue
{
    ElemType data[MAX_SIZE];
    int head;
    int tail;
    int size;
}SQQueue;
SQQueue queue;

初始化和清空

STATUS init_queue(SQQueue *q)
{
    q->head = 0; 
    q->tail = 0;
    q->size = 0;      
}

STATUS clear_queue(SQQueue *q)
{
    init_queue(q);
}

判空

bool queue_is_empty(SQQueue q)
{
    if(q.size == 0)
    {
        return true;
    }
    return false;
}

入队

STATUS enqueue(SQQueue *q, ElemType e)
{
    if(q->size >= MAX_SIZE)
        return ERROR;
    if(q->size == 0)
        q->tail -=1;
    (q->size)++;
    q->tail = (q->tail + 1) % MAX_SIZE;
    q->data[q->tail] = e;
    return OK;
}

出队

STATUS dequeue(SQQueue *q, ElemType *e)
{
    if(q->size <= 0)
        return ERROR;
    (q->size)--;
    *e = q->data[q->head];
    q->head = (q->head + 1) % MAX_SIZE;
    return OK;
}