1.5线性结构之队列
1.5.1基本概念
也是操作受限的线性表,限制为仅允许在表的一端进行插入(入队或进队)
,在表的另一端进行删除(出队或离队)
操作。
队首(front)
:允许进行删除的一端称为队首。队尾(rear)
: 允许进行插入的一端称为队尾。
在空队列中依次加入元素a1,a2, …, an之后,a1是队首元素,an是队尾元素。显然退出队列的次序也只能是a1,a2, …, an。
队列,是一种先进先出(First In First Out ,简称FIFO)
的线性结构。类似于生活中的排队行为。
队列中没有元素时,称为空队列。
1.5.2 队列的存储结构
可用顺序表(数组)和链表来存储队列,队列按存储结构可分为顺序队列和链式队列两种。
1.5.3队列常见问题
队列常见的问题:
出现的问题:
顺序队列中存在“假溢出”
现象:尽管队列中实际元素个数可能远远小于数组大小,但可能由于尾指针rear已超出向量空间的上界而不能做入队操作。
为充分利用空间,克服上述“假溢出”现象,有两种方法
方法1:使用数组实现,入队列时添加到队列的最后,出队列时移除第一个元素同时将右侧的元素左移。
方法2:为队列分配的向量空间看成是一个首尾相接的圆环,这种队列称为循环队列。
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 <stdio.h>
#include <stdlib.h>
// 队列
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;
}