目录
队列的定义
队列(Queue):只允许在一端进行进行插入,在另一端删除的受限制的线性表
特点:先进先出(FIFO)First in First Out
队头(rear):允许删除元素的一端
队尾(front):允许插入元素的一端
队列的基本操作:
InitQueue(&Q):初始化队列)。
DestroyQueue(&Q):销毁队列。
EnQueue(&Q,x):入队,若队列Q未满,将x加入到队尾,使之成为新的队尾。
DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,用x返回。
GetQueue(Q,&x):读队头元素,若队列Q非空,则将队头元素赋给x。
队列的顺序实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct {
int* data;
int rear, front;
}SqQueue;
front:指向队头元素
rear:指向队尾元素的后一位置(下一个应该插入的位置 )
初始化
//初始化
int InitQueue(SqQueue& S)
{
S.data = (int*)malloc(MaxSize * sizeof(int));
if (!S.data)
return 0;
S.rear = S.front = 0;
return 1;
}
判断是否为空
//判断是否为空
int EmptyQueue(SqQueue S)
{
if (S.rear == S.front)
return 1;
else
return 0;
}
求队列长度
//求队列的长度
int QueueLength(SqQueue S)
{
return (S.rear - S.front + MaxSize) % MaxSize;
}
我的入队和出队采用的时牺牲一个存储空间的写法
入队
//入队:在队尾rear插入元素
int EnQueue(SqQueue& S, int x)
{
if ((S.rear + 1) % MaxSize == S.front)//判断是否已满
return 0;
S.data[S.rear] = x;//插入元素x
S.rear = (S.rear + 1) % MaxSize;//将rear移动一位
return 1;
}
出队
//出队:在队头front删除元素
int DeQueue(SqQueue& S, int& x)
{
if (S.rear == S.front)//判断是否为空
return 0;
x = S.data[S.front];//用x来返回删除的元素的值
S.front = (S.front + 1) % MaxSize;//将front要移动一位
return 1;
}
读队头元素(不删除元素)
//读队头元素
int GetQueue(SqQueue S,int&x)
{
if (S.rear == S.front)
return 0;
x = S.data[S.front];
return 1;
}
重点!!!判断队列的已满/已空
三种方法
F1:最常用的一种(牺牲一个存储空间)
已空:S.front == S.rear;
已满:(S.rear+1) % MaxSize ==S.front;
F2:设置标志位
#define MaxSize 100
typedef struct {
int* data;
int rear, front;
int tag;//标志位
}SqQueue;
初始化时rear = front = 0; tag = 0;
每次删除成功时,令 tag = 0;
每次删除成功时,令 tag = 1;
队空的条件:front == rear && tag == 0;
队满的条件:front == rear && tag == 1;
F3:增加一个size记录队列的长度
#define MaxSize 100
typedef struct {
int* data;
int rear, front;
int size;//用size记录队列的长度
}SqQueue;
初始化时:front == rear = 0; size = 0;
队空条件:size == 0;
队满条件:size == MaxSize;