简述
概念定义
队列 : 是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出的特性。
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。
附上相关动画演示
链接:https://pan.baidu.com/s/1QZcPnl1nKsJFwYNQCi81_w
提取码:3b61
复制这段内容后打开百度网盘手机App,操作更方便哦
抽象数据类型定义
ADT Queue
数据元素:可以是任意类型的数据,但必须属于同一个数据
对象。
关系:队列中数据元素之间是线性关系。
实现
链式队列
结构定义
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}LinkQueueNode;
typedef struct {
LinkQueueNode *head;
LinkQueueNode *tail;
}LinkQueue;
初始化
void Init(LinkQueue *q)
{
q->tail = q->head = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
q->head->next = NULL;
}
插入
void Enter(LinkQueue *q, ElemType e)
{
LinkQueueNode *t = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
t->data = e;
t->next = NULL;
q->tail->next = t;
q->tail = t;
}
取出
ElemType Out(LinkQueue *q)
{
LinkQueueNode *t = q->head->next;
ElemType e = t->data;
q->head->next = t->next;
if(q->head->next == NULL)
q->tail = q->head;
free(t);
return e;
}
调用
循环队列
结构定义
#define MAXSIZE 4 ##我这里采取的方式实际只能容纳3个元素,因为空闲最后一个元素使得判空和判满的条件不一样啦
typedef int ElemType;
typedef struct {
ElemType elems[MAXSIZE];
int head;
int tail;
}SeqQueue;
初始化
void Init(SeqQueue *q)
{
q->tail = q->head = 0;
}
插入
void Enter(SeqQueue *q, ElemType e)
{
if((q->tail+1) % MAXSIZE == q->head)
{
printf("队列已满");
return;
}
q->elems[q->tail] = e;
q->tail = (q->tail + 1) % MAXSIZE;
}
取出
ElemType Out(SeqQueue *q)
{
ElemType e;
if(q->head == q->tail)
{
printf("队列已空");
return -1;
}
e = q->elems[q->head];
q->head = (q->head + 1) % MAXSIZE;
return e;
}