队列
队列是一种“先进先出”数据结构,且其进入方式为尾进头出。
1.队列的存储结构
顺序循环队列的存储结构
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int front, rear;
}SqQueue;
链式队列的存储结构
typedef int ElemType;
//结点结构
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
//队列结构
typedef struct{
LinkNode *front, *rear;
}LinkQueue;
2.队列的初始化
顺序循环队列的初始化
顺序循环队列的初始化只需要将其头尾指针设置同时设置为0,即可完成初始化操作;
bool InitQueue(SqQueue &Q){
/*初始化循环队列*/
Q.front = Q.rear = 0;
return true;
}
链式队列的初始化
链式队列式含有头结点的,所以初始化要分配一个头结点的内存,并将头尾指针全部指向该头结点,且头结点的next指针设为NULL;
bool InitQueue(LinkQueue &Q){
/*初始化循环队列*/
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL; //含有头节点
return true;
}
3.队列的入队操作
顺序循环队列的入队操作
顺序循环队列的入队操作需要考虑溢出问题,所以其入队后rear指针的后移需要使用相应的赋值方式,即可完成操作;
bool EnQueue(SqQueue &Q, ElemType e){
/*入队操作*/
//1.判断队满
if (Q.front == (Q.rear + 1 + MaxSize) % MaxSize)
return false;
//2.入队
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
链式队列的入队操作
链式栈的入队需要创建新的结点p,将p结点加到队列中后,要将rear指针后移,使其达到队尾,即可完成操作;
bool EnQueue(LinkQueue &Q, ElemType e){
/*入队操作*/
LinkNode *p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = e;
Q.rear->next = p;
Q.rear = p;
return true;
}
4.队列的出队操作
顺序循环队列的出队操作
顺序循环队列的出队操作需要考是否出队元素是最后元素问题,所以其出队后front指针的后移需要使用相应的赋值方式,即可完成操作;
bool DeQueue(SqQueue &Q, ElemType &e){
/*出队操作*/
//1.判断队列是否为空
if (Q.front == Q.rear)
return false;
//2.出队
e = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
链式队列的出队操作
链式栈的出队需要定义临时指针p,将front头指针所指元素赋值给p,其删除后需要考虑是否为最后一个元素,若是则需要将rear指针指向front指针所指结点,即可完成操作;
bool DeQueue(LinkQueue &Q, ElemType &e){
/*出队操作*/
//1.判断队列是否为空
if (Q.front == Q.rear)
return false;
LinkNode *p = Q.front->next;
e = p->data;
Q.front->next = p->next;
//2.判断是否为最后一个元素的出队
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return true;
}
5.顺序队列补充
循环队列的设计会使得其最后一个空间不会被利用,普通队列因为队满与队空无法区分所以则会产生溢出,因此有两种方式得到解决:
(1)设置队列当前大小变量,其存储结构为:
typedef struct {
ElemType data[MaxSize];
int front, rear;
int size; //设置此标记就可以区分队空与队满的情况了
}SqQueue;
(1)设置出队入队标记位,出队操作时时将其设成0, 入队操作时时将其设成1,其存储结构为:
typedef struct {
ElemType data[MaxSize];
int front, rear;
int tag; //出队入队标记位
}SqQueue;