数据结构笔记之队列

1.5线性结构之队列

1.5.1基本概念

也是操作受限的线性表,限制为仅允许在表的一端进行插入(入队或进队),在表的另一端进行删除(出队或离队)操作。

  • 队首(front) :允许进行删除的一端称为队首。
  • 队尾(rear): 允许进行插入的一端称为队尾。
    在空队列中依次加入元素a1,a2, …, an之后,a1是队首元素,an是队尾元素。显然退出队列的次序也只能是a1,a2, …, an。
    队列,是一种先进先出(First In First Out ,简称FIFO)的线性结构。类似于生活中的排队行为。
    数据结构笔记之队列_第1张图片

队列中没有元素时,称为空队列。

1.5.2 队列的存储结构

可用顺序表(数组)和链表来存储队列,队列按存储结构可分为顺序队列和链式队列两种。

1.5.3队列常见问题

队列常见的问题:
数据结构笔记之队列_第2张图片

出现的问题:

顺序队列中存在“假溢出”现象:尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针rear已超出向量空间的上界而不能做入队操作。

为充分利用空间,克服上述“假溢出”现象,有两种方法

方法1:使用数组实现,入队列时添加到队列的最后,出队列时移除第一个元素同时将右侧的元素左移。

方法2:为队列分配的向量空间看成是一个首尾相接的圆环,这种队列称为循环队列。
数据结构笔记之队列_第3张图片

1.5.4 功能定义

初始化队列
void initQueue(Queue *queue, size_t capacity)
返回队列内元素个数
size_t getSize(const Queue *queue)
添加新元素
void enqueue(Queue *queue, int element)
元素出队列
int dequeue(Queue *queue)
释放队列内存
void destroyQueue(Queue *queue)

1.5.5 代码实现

#include 
#include 

// 队列
typedef struct
{
    int *data;
    int capccity;
    int size;
    int front;
    int rear;
} Queue;

// 初始化队列
void initQueue(Queue *queue, size_t capacity)
{
    queue->data = (int *)malloc(capacity * sizeof(int));
    queue->capccity = capacity;
    queue->size = 0;
    queue->front = 0;
    queue->rear = 0;
}
// 返回队列内元素个数
size_t getSize(const Queue *queue)
{

    return queue->size;
}
// 添加新元素
void enqueue(Queue *queue, int element)
{
    if (queue->size == queue->capccity)
    {
        // 容量已满
        printf("满\n");
    }

    queue->data[queue->rear] = element;
    queue->size++;
    queue->rear = (queue->rear + 1) % queue->capccity;
}
// 元素出队列
int dequeue(Queue *queue)
{

    if (queue->size)
    {
        printf("队列为空,出队失败\n");
        return -1;
    }

    int deQueue = queue->data[queue->front];
    queue->size--;
    queue->front = (queue->front + 1) % queue->capccity;
    return deQueue;
}
// 释放队列内存
void destroyQueue(Queue *queue)
{

    free(queue->data);
    queue->data = NULL;
    queue->capccity = 0;
    queue->size = 0;
    queue->front = 0;
    queue->rear = 0;
}

void printt(Queue *Queue)
{
    for (int i = Queue->front,j = 1;j < Queue->size; i++,j++)
    {
        printf("%d", Queue->data[i  % Queue->capccity]);
    }
    printf("\n");
}
int main()
{

    Queue myQueue;
    initQueue(&myQueue,4);
    enqueue(&myQueue,1);
    enqueue(&myQueue,5);
    enqueue(&myQueue,2);
    enqueue(&myQueue,7);
    printt(&myQueue);

    destroyQueue(&myQueue);
    getchar();
    return 0;
}

你可能感兴趣的:(数据结构,笔记,网络)