版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wanglele1/article/details/79180465
队列的定义:队列简称队,它是一种运算受控的线性表,其限制为仅允许在标的一段进行插入,在表的另一端进行删除。可进行插入的是队尾,可进行删除的是队头。 向队列中插入元素称为进队,新元素进队后称为新的队尾元素,从队列中删除元素称为出队,元素出队后,其后继元素成为新的队头元素。
队列的特点:先进先出(FIFO)
队列的存储结构:顺序队与链队
一,顺序队
队列的顺序存储结构表示:
#define maxsize 100 //队列可能达到的最大长度
typedef struct
{
int data[maxsize];
int front; //队首指针
int rear; //队尾指针
}SqQueue;
1,循环队列的初始化
循环队列的初始化操作就是动态分配一个大小为maxsize的数组空间
①为队列分配一个最大容量为maxsize的数组空间,base指向数组空间的首地址
②头指针和尾指针置零,表示队列为空
【算法描述】
status InitQueue(SqQueue &q)
{//构造一个空队列Q
Q.base=new QElemeType[maxsize]; // 为队列分配一个最大容量为maxsize的数组空间
if(!Q.base) exit(overflow); //存储分配失败
Q.front=Q.rear=0; //头指针和尾指针置零
return ok;
}
2,求循环队列的长度
【算法描述】
int QueueLength(SqQueue q)
{//返回Q的元素个数,即队列的长度
return(Q.rear-Q.front+maxsize)%maxsize;
}
3,入队
【算法描述】
status EnQueu(SqQueue &Q,QElemType)
{//插入元素为Q的新的队列元素
if((Q.rear+1)%maxsize==q.front)
return error;
Q.base[Q.rear]=e; //新元素插入队尾
Q.rear=(q.rear+1)%maxsize //队尾指针加1
return ok;
}
4,出队
【算法描述】
status DeQueu(SqQueue &Q,QElemType)
{//插入元素为Q的新的队列元素
if(Q.front==Q.rear) //队空
return error;
Q.base[Q.front]=e; //新元素插入队尾
Q.front=(q.front+1)%maxsize //队尾指针加1
return ok;
}
5,取循环队列的队头元素
SElemType GetHead(Squeue Q)
{//返回Q的队头元素,不修改队头指针
if(Q.rear==Q.front) //队列不为空
return Q.base[Q.front]; //返回队头元素的值,队头指针不变
}
二,循环队列的实现
#include<stdio.h>
#include<stdlib.h>
#define maxsize 50
typedef struct SqQueue{
int data[maxsize];
int front;//队首指针
int rear;//队尾指针
}SqQueue;
//创建循环队列
SqQueue initQueue(){
SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue));
sq->rear=sq->front=0;
return *sq;
}
//判断循环队列是否为空
int isEmpty(SqQueue qu){
return (qu.front ==qu.rear?1:0);
}
//元素进循环队列
int enQueue(SqQueue *qu,int x){
if((qu->rear+1)%maxsize ==qu->front){
return 0;
}
qu->rear=(qu->rear+1)%maxsize;
qu->data[qu->rear]=x;
return 1;
}
//元素出循环队列
int deQueue(SqQueue *qu,int *y){
if(qu->rear ==qu->front){
return 0;
}
*y=qu->data[qu->front];
qu->front=(qu->front+1)%maxsize;
return 1;
}
//打印循环队列
int printQueue(SqQueue qu){
if(qu.rear ==qu.front){
return 0;
}
while(qu.rear !=qu.front){
qu.front=(qu.front+1)%maxsize;
printf("当前队列值=%d\n",qu.data[qu.front]);
}
return 1;
}
void main(){
int y=0;
SqQueue sq =initQueue();
enQueue(&sq,1);
enQueue(&sq,2);
enQueue(&sq,3);
enQueue(&sq,4);
deQueue(&sq,&y);
printQueue(sq);
printf("当前的front=%d\n",sq.front);
printf("当前的rear=%d\n",sq.rear);
}