知识图谱
1.顺序存储
队列采用数组保存,且含有数据(任意类型),队头和队尾指针(int),所以采用结构体描述。
#define MaxSize 10;//队列中元素的最大个数
typedef char ElemType;//元素类型
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQuene;
循环队列
注意:在以下的循环队列中均假定front指向队头元素,rear指向队尾元素的下一个位置。
A.初始化
void InitQueue(SqQueue &Q){
Q.rear=Q.front=0;
}
B.判空
bool isEmpty(SqQueue Q){
if(Q.rear==Q.front)
return true;
else
return false;
}
C.入队
bool EnQueue(SqQueue &Q,Elemtype x){
if((Q.rear+1)%MaxSize==Q.front)//队列已满
//这里front指向队头元素,rear指向队尾元素的下一个元素
//牺牲了一个存储单元,队列满时,rear指向的是空的存储单元
return false;
else
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return true;
}
D.出队
bool DeQueue(SqQueue &Q,Elemtype &x){
if(Q.rear==Q.front)//队列为空
return false;
else
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
note:
(1)初始时,rear=front=0;
(2)队空条件:rear=front;
(3)队满条件:(rear+1)%maxsize=front;
这种情况下,循环队列中有一个空单元,rear正指向它,front指向它的下一个单元;
(4)队列长度:(rear-front+maxsize)%maxsize;
(5)队列中最多有n-1个元素;
(6)以上这些情况均为:front指向队头元素,rear指向队尾元素的下一个元素。
2.链式存储
链式队列
front指向链首结点(一般为头节点),rear指向链尾结点。
链队包含各个结点(包括数据域和下一个指针域)和头尾指针,而头尾指针类型是结点类型。因此采用结构体定义链队,先定义结点。
typedef struct LinkNode {
Elemtype data;
struct LinkNode *next;
}LinkNode;//结点定义
typedef struct{
LinkNode *front,*rear;
}LinkQueue;//链队定义
tips:以下讨论关于链队的操作均建立在链队有头节点的基础上。
A.初始化
void InitQueue(LinkQueue &Q)
{
s=(LinkNode*)malloc(sizeof(LinkNode));//申请一个结点
Q.front=Q.rear=s;
Q.rear->next=null;
}
B.判队空
bool IsEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
return true;
else
return false;
}
C.入队
void EnQueue(LinkQueue &Q,Elemtype x)
{
p=(LinkNode*)malloc(sizeof(LinkNode));//申请一个结点
p->data=x;
p->next=null;
Q.rear->next=p;//插入链尾
Q.rear=p;//使p成为新的尾指针
}
D.出队
bool DeQueue(LinkQueue &Q,Elemtype &x)
{
if(Q.front==Q.rear)//先判断链队是否为空
return false;
else
p=Q.front->next;//找到队首结点
x=p->data;//将队首结点的值读出
Q.front->next=p->next;//删除队首结点
if(Q.rear==p)//队列中只有一个结点时,修改尾指针
Q.rear=Q.front;
free(p);//释放p空间
return true;
}
note:
(1)初始时,rear=front=新节点;
(2)由于是链队,入队时不需判断队列是否已满;
(3)出队时需要判断队列是否为空,当删除的结点是链队尾结点时,需要修改尾指针。
3.双端队列
允许两端都可以进行入队和出队操作的队列。
关于队列的其它遗留问题见:https://blog.csdn.net/pilgrim_121/article/details/88550400