基本要求:
1,队列的基本概念
2,队列的顺序结构
3,队列的链式结构
4,队列的应用
5,特殊矩阵的压缩存储
一,队列的基本概念
1,定义:队列(queue),与栈相类似,也是一种操作受限的线性表,其限制于仅允许在表的一端进行插入,在标的另一端进行删除。可插入的一端称为队尾(Rear),可删除的一端称之为对头(Front)。向队列中插入新的元素称之为进队,进队之后称为队尾元素;从队列中删除元素称为出队,该元素出队后,其后相邻的元素成为新的对头元素。
2,特点:先进先出(FIFO)。
注:队列按存储结构可分为顺序队和链队两种。
二
1,顺序队:
基本操作:
1>.初始化队列:
void initQueue(SqQueue &qu)
{
qu.front=qu.rear=0;
}
2>.判队空:
int QueueEmpty(SqQueue qu){
if(qu.front==qu.rear)
return 1;
else
return 0;
}
3>.进队:
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;
}
4>.出队:
int deQueue(SqQueue &qu,int &x){
if(qu.front==qu.rear)
return 0;
qu.front=(qu.front+1)%maxsize;
x=qu.data[qu.front];
return 1;
}
链队:采用链表存储结构存储队列(采用单链表的形式),链队特点:不存在队列满上溢的情况(当内存满了就上溢了)。
1.链队的要素:
有两个特殊状态和操作。
①两个状态
1>队空状态。
lqu->rear==NULL或lqu->front==NULL;
2>队满状态。
不存在队列满的情况(假设内存无限大的情况下不存在)。
②两个操作
1>元素进队操作(假设p指向进队元素)
lqu->rear->next=p;
lqu->rear=p;
2.
1>初始化链队
void initQueue(LiQueue *&lqu){
lqu=(LiQueue *)malloc(sizeof(LiQueue));
lqu->front=lqu->rear=NULL;
}
2>判断队空
int QueueEmpty(LiQueue *lqu){
if(lqu->rear==NULL||lqu->front==NULL)
return 1;
else
return 0;
}
3>入队
void enQueue(LiQueue *lqu,int x){
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
p->data=x;
p->next=NULL;
if(lqu->rear==NULL)
lqu->front=lqu->rear=p;
else{
lqu->rear->next=p;
lqu->rear=p;
}
}
4>出队
int deQueue(LiQueue *lqu,int &x){
QNode *p;
if(lqu->rear==NULL)
return 0;
else
p=lqu->front;
if(lqu->front==lqu->rear)
lqu->front=lqu->rear=NULL;
else
lqu->front=lqu->front->next;
x=p->data;
free(p);
return 1;
}