队列的基本概念
队列(Queue):也是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端进行插入,而在另一端进行删除。
队首(front) :允许进行删除的一端称为队首。
队尾(rear) :允许进行插入的一端称为队尾。
例如:排队购物。操作系统中的作业排队。先进入队列的成员总是先离开队列。
队列中没有元素时称为空队列。在空队列中依次加入元素a1, a2, …,an之后,a1是队首元素,an是队尾元素。显然退出队列的次序也只能是a1, a2, …,an ,即队列的修改是依先进先出的原则进行的,如图所示:
利用一组连续的存储单元(一维数组)依次存放从队首到队尾的各个元素,称为顺序队列。
对于队列,和顺序栈相类似,也有动态和静态之分。本部分介绍的是静态顺序队列,其类型定义如下:
#include <stdio.h>
#include <stdlib.h>
#ifndef _LIST_H
#define _LIST_H
#define N 100
typedef char datatype;
typedef struct _Queue
{
datatype data[N];
int front;
int rear;
}Queue;
//初始化
void InitList(Queue *q);
//判断队列是否为空
int IsEmpty(Queue *q);
//入队列
void EnQueue(Queue *q, datatype value);
//出队列
datatype DeQueue(Queue *q);
//获得队头元素
datatype GetHead(Queue *q);
//输出队列元素
void PrintData(Queue *q);
#endif //_LIST_H
//以上函数的实现
#include "List.h"
//队列的初始化
void InitList(Queue *q)
{
q->front = q->rear = 0;
}
//判读队列是否为空
int IsEmpty(Queue *q)
{
if (q->front == q->rear)
{
return 1;
}
else
{
return 0;
}
}
//入队列
void EnQueue(Queue *q, datatype value)
{
if (N == q->rear)
{
printf("queue full\n");
return;
}
else
{
q->data[q->rear] = value;
q->rear += 1;
}
}
//出队列
datatype DeQueue(Queue *q)
{
if (q->front == q->rear)
{
printf("队列是空的\n");
return 0;
}
else
{
q->front += 1;
return q->data[q->front - 1];
}
}
//获得队头元素
datatype GetHead(Queue *q)
{
if (q->front == q->rear)
{
return 0;
}
else
{
return q->data[q->front];
}
}
//输出队列元素
void PrintData(Queue *q)
{
if (q->front == q->rear)
{
printf("Queue full\n");
return;
}
else
{
for (int i = q->front; i < q->rear; ++i)
{
printf("%c\n", q->data[i]);
}
}
}
//测试
#include <stdio.h>
#include "List.h"
int main(void)
{
Queue q;
InitList(&q);
if (1 == IsEmpty(&q))
{
printf("队列是空的\n");
}
else
{
printf("队列不是空的\n");
}
// for (datatype i = 'A'; i < 'F'; ++i)
// {
// EnQueue(&q, i);
// }
printf("%c\n", GetHead(&q));
PrintData(&q);
return 0;
}