数据结构与算法(8)—线性队列
(mi6236)
1、顺序队列
1.1、队列的定义
队列(queuq)简称队,它也是一种运算受限的线形表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。我们把进行插入的一端称为队尾(rear),进行删除的一端称为队首(front)。向队列中插入新元素称作进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称为出队,出队后,其后继元素成为队首元素。由于队列的插入和删除分别在两端进行,所以要删除的元素将是队列中最先进入的元素,因此以把队列称作先进先出(First In First Out,简称FIFO)表。
在日常生活中,人们为购物或等车时所排的队就是一个队列,新来购物或等车的人接到队尾(即进队),站在队首的人购物或上车后离去(即出队),当最后一人购物或上车后,则队为空。
1.2、队列的顺序存储结构
顺序存储结构采用一维数组(向量)实现,设队列头指针front和队列尾指针rear,并且假设front指向队头元素的前一个位置,rear指向队尾元素。若不考虑满,则入队操作语句为Q[rear++]=x;若不考虑队空,则出队操作语句为x=Q[front].当然,出队时,并不一定需要队头元素。按上述的做法,有可能出现假溢出,即队尾已到达一维数组的高端,不能再入队,但因为连续出队,队列中元素个数并未达到最大值。解决这种问题,可用循环队列。在循环队列中,需要区分队空和队满:仍用front=rear表示队空,在牺牲一个单元的前提下,用front=(rear+1)%MAX表示队列满。在这种约定下,入队操作的语句为rear=(rear+1)%MAX,Q[rear++]=x,出队操作语句为:front=(front+1)%MAX,x=Q[++front].
1.3、顺序队列基本函数算法描述
注:以下程序在VC6.0+WIN98下测试通过。
#include <stdio.h>
#define QueueSize 20 /*队列的容量*/
typedef int ElemType;
typedef struct Squeue{
ElemType data[QueueSize];
int front,rear;
}Squeue;
/*初始化队列*/
void InitQueue(Squeue *sq)
{
sq->front=sq->rear=0;
}
/*判断队列是不否为空*/
int QueueEmpty(Squeue sq)
{
if(sq.front==sq.rear)
return 1;
else
return 0;
}
/*入队*/
int InQueue(Squeue *sq,ElemType e)
{
if((sq->rear+1)%QueueSize==sq->front)
{
printf("Queue is overflow./n");
return 0;
}
else
{
sq->rear=(sq->rear+1)%QueueSize;
sq->data[sq->rear]=e;
return 1;
}
}
/*出队*/
OutQueue(Squeue *sq,ElemType *e)
{
if(sq->front==sq->rear)
{
printf("Queue is empty./n");
return 0;
}
else
{
*e=sq->data[sq->front];
sq->front=(sq->front+1)%QueueSize;
return 1;
}
}
/*取队首元素*/
int GetQueue(Squeue sq,ElemType *e)
{
if(sq.front==sq.rear)
{
printf("Queue is empty./n");
return 0;
}
else
{
*e=sq.data[(sq.front+1)%QueueSize];
return 1;
}
}
/*清空队列*/
void ClearQueue(Squeue *sq)
{
sq->front=sq->rear=0;
}
/*显示队列中的元素*/
void ShowQueue(Squeue sq)
{
if (sq.front==sq.rear)
printf("队列为空/n");
while(sq.front!=sq.rear)
{
sq.front=(sq.front+1)%QueueSize;
printf("队列中的第%d个元素是%d/n",sq.front,sq.data[sq.front]);
}
}
int main()
{
Squeue sq;
ElemType e;
InitQueue(&sq);
if (QueueEmpty(sq))
printf("队列为空/n");
printf("请输入数字:");
scanf("%d",&e);
InQueue(&sq,e);
printf("请输入数字:");
scanf("%d",&e);
InQueue(&sq,e);
ShowQueue(sq);
GetQueue(sq,&e);
printf("队首元素为%d/n",e);
OutQueue(&sq,&e);
ShowQueue(sq);
GetQueue(sq,&e);
printf("队首元素为%d/n",e);
ClearQueue(&sq);
ShowQueue(sq);
return 0;
}