数据结构之队列的顺序表示
(一)队列
队列是仅在表尾进行插入操作,表头进行删除操作的线性表,是一种先进先出的线性表
入队操作尾指针,出队移动头指针。
队列的存储结构为链队或者顺序队(常用循环顺序队)
1. 抽象数据结构
ADT Queue{
D = {ai|ai ∈E了吗Set,i=1,2...,n>=0} // 数据对象
R = {<a(i-1),ai>|a(i-1), ai ∈D,I = 2,...,n} // 数据关系
// 约定其中a1端为队列头,an端为队列尾
} ADT Queue
(二)队列的顺序表示和实现
#define MAXQSIZE 100 // 最大队列长度
Typedef struct{
QElenType *base // 初始化的动态分配储存空间
int front // 头指针
int rear // 尾指针
}
1.循环队列的实现

当rear = MAXQSIZE时,会发生溢出,
就是当front != 0 但是 rear = MAXQSIZE时,会发生入队假溢出。
解决方案
将队空间设想成一个循环的表,即分配给队列的m个储存单元可以循环使用,当rear为maxqsize时,若向量的开始端空着,又可以从头使用空着的空间。当front 为maxqsize时,也是一样。
实现方案:求余数,当位置小于最大位置时候取余为自己。但是当等于最大长度时为0,回到起点。
缺点:当front = rear 时候,不能判断是队空还是队满插入元素:Q.base[Q.rear] = x
Q.rear = (Q.rear + 1)%MAXQSIZE删除元素:x = Q.base[s.front]
Q.front = (Q.front + 1)%MAXQSIZE少用一个元素空间用于解决循环队列的判断方法
队空:front = rear
队满: (rear+1)%MAXQSIXZE = front

(1)循环队列的数据结构
#define MAXQSIZE 100 // 最大队列长度
Typedef struct{
QElenType *base // 初始化的动态分配储存空间
int front // 头指针,若队列不为空,指向队列头元素
int rear // 尾指针,若队列不为空,指向队列尾元素的下一个位置
}SQqueue
(2)队列的初始化
Status InitQueue(SqQueue &Q){
Q.base = new QElemType[MAXQSIZE] // 分配数值空间
if(!Q.base) exit (OVERFLOW) // 分配失败
Q.front = Q.rear =0 // 初始化头尾指针,头尾指针置0,队列为空
return OK
}
(3)求队列的长度
int QueueLength(SqQueu Q){
return (Q.rear - Q.front +MAXQSIZE)%MAXQSIZE)
}
(4)队列的入队
Status EnQueue(SqQueue &Q, QElemType e) {
if((Q.rear+1)%MAXQSIZE == Q.front) return ERROR // 判断是否队满
Q.rear = (Q.rear + 1)%MAXQSIZE // 队尾指针+1
return OK
}
(5)队列的出队
Status DeQueue(SqQueue &Q, QElemType &e) {
if(Q.front == Q.rear) return ERROR // 判断是否队空
e = Q.base[Q.front] // 保存队头元素
Q.front = (Q.front + 1)%MAXQSIZE // 队头指针+1
return OK
}
(6)队列取队头元素
SElemType GetHead(SqQuere Q) {
if(Q.front != Q.rear) return Q.base[Q.front] // 队列不为空,返回队头指针元素的值,队头指针不变
}

浙公网安备 33010602011771号