课本上列出了链队列和循环队列的算法,那么在本文章中咱们完成顺序队列的算法的实现吧
顺序队列,我们可以理解为顺序表,只不过插入元素和删除元素的位置受限,只能在表头或者表尾。
因此,我们对顺序表的算法稍加修改即可得到顺序队列的各种基本操作的实现——
顺序队列的存储结构:
typedef int QElemType;
typedef struct {
QElemType *base;//初始化的动态分配储存空间
int front;//头指针,若队列不空,指向队列头元素
int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
} SqQueue; //顺序队列
队列初始化
Status InitQueue(SqQueue *Q) {
//构造一个空队列Q
Q->base = (QElemType*)malloc(sizeof(QElemType) * MAXQSIZE);//实际可用的是MAXQSIZE-1个空间
if(!Q->base) return OVERFLOW;//储存空间分配失败
Q->front = Q->rear = 0;
return OK;
}
2.销毁队列
Status DestroyQueue(SqQueue *Q) {
if(Q->base) {
free(Q->base);
Q->base = NULL;
}
return OK;
}
3.队列判空
Status QueueEmpty(SqQueue Q) {
if(Q.front == Q.rear) return TRUE;
return FALSE;
}
4.遍历队列并输出
Status QueueTraverse(SqQueue Q) {
while(Q.front != Q.rear) {
printf("%d ", Q.base[Q.front]);
Q.front = (Q.front + 1) % MAXQSIZE;
}
return OK;
}
5.求队列长度
int QueueLength(SqQueue Q) {
return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
6.清空队列
Status ClearQueue(SqQueue* Q) {
if(Q->base){
Q->front == Q->rear;
}
return OK;
}
7.返回队头元素
Status GetHead(SqQueue Q, QElemType* e) {
if(Q.front == Q.rear) return ERROR;
*e = Q.base[Q.front];
return OK;
}
8.出队
Status DeQueue(SqQueue *Q, QElemType* e) {
//若队列不空,则删除Q的队头元素
if(Q->front == Q->rear) return ERROR;
*e = Q->base[Q->front];
Q->front = (Q->front + 1) % MAXQSIZE;
return OK;
}
9.入队
Status EnQueue(SqQueue *Q, QElemType e) {
//插入元素e为Q的新的队尾元素
if((Q->rear + 1) % MAXQSIZE == Q->front) return ERROR;//队满
Q->base[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXQSIZE;
return OK;
}