一、队列是什么?
队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
二、队列的顺序存储结构
1.队列的顺序存储
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front; //指向队头元素
int rear; //指向队尾元素的后一个位置(下一个应该插入的位置)
}SqQueue;
队列入队的基本操作
//入队
bool EnQueue(SqQueue &Q,ElemType x){
if(队列已满)
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize; //{0,1,2,...MaxSize-1}将存储空间在逻辑上变成了“环状”
return ture;
}
2.循环队列
(1)入队
//循环队列的入队操作,让队尾元素入队
bool QueueEmpty(SqQueue Q){
if(Q.rear==Q.front) //判断队空
return ture;
else
return false;
}
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) //判断队满
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return ture;
}
(2)出队
//循环队列的出队操作,让队头元素出队
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front) //判断队空
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize; //队头指针后移
return ture;
}
//获取队头元素的值
bool GetHead(SqQueue Q,ElemType &x){
if(Q.rear==Q.front) //判断队空
return false;
x=Q.data[Q.front];
return ture;
}
判断队列已满/已空的条件
方式一:牺牲一个存储单元
//队列已满的条件判别,队尾指针的在下一个位置是队头
(Q.rear+1)%MaxSize==Q.front;
//队空条件(初始化时,rear=front=0)
Q.rear==Q.front;
//队列元素个数
(rear+MaxSize-front)%MaxSize
方式二:初始化时,rear=front=size=0,插入成功size++;删除成功size–;
//队空条件:
size==0;
//队满条件
size==MaxSize;
方式三:初始化时,rear=front=tag=0,插入成功tag=1;删除成功tag=0;
//队空条件:
front==rear&&tag==0;
//队满条件
front==rear&&tag==1;
三、队列的链式存储
1.队列的链式存储
typedef struct Linknode{ //链式队列结点
Elemtype data;
struct Linknode *next;
}*LinkNode;
typedef struct{ //链式队列
LinkNode *front,*rear;
}LinkQueue;