1 队列
1.1 队列的定义
1) 队列简称队,它是一种操作受限的线性表,其限制为在标的一段进行插入,而在包的另一端进行删除。把进行插入的一端称为队尾(rear),把进行删除的一端称作队头或队首(front)。向队列中插入新元素称为进队或入队,新的元素进队后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。
2)由于队列的插入和删除操作分别在各自的一端进行的,每个元素必然按照进队的次序出队,所以又把队列称为先进先出表。
2 队列的顺序存储结构及其基本运算的实现
队列的顺序储存结构需要使用一个数组和两个整数型变量来实现。利用数组顺序储存队列中所有元素,利用两个整型变量分别储存队首元素和队尾元素下表位置,分别称它为队首指针和队尾指针。
假设队列的所有元素不超过整数 MaxSize,所有元素都有具有同一数据类ElemType
,则顺序队列类型SqQueue定义如下:
typedef struct
{
ElemType data[MaxSize]; //存放队中元素
int front; //队头指针
int rear; //队尾指针
}SqQueue; //定义顺序队类型
(1)初始化队列 InitQueue(q)。
构造一个空队列q。将front和rear指针均设置为初始状态即-1。
void InitQueue(SqQueue * &q)
{
q=(SqQueue*)malloc(sizeof(SqQueue));
q->front = q->rear = -1;
}
(2)销毁队列 DestoryQueue(q)。
释放队列q占用的储存空间。
void DestoryQueue(SqQueue * &q)
{
free(q);
}
(3)判断队列是否为空 QueueEmpty(q)。
若队列q满足q->front=q->rear条件,则返回true;否则返回false。
bool QueueEmpty(SqQueue * &q)
{
return (q->from == q->rear);
}
(4)进队列 enQueue(q,e)。
在栈不满的情况下,现将队尾指针rear自增1,然后将元素添加到该位置。
bool enQueue(SqQueue * &q,ElemType e)
{
if(q->rear == MaxSize-1)
return false;
q->rear ++;
q->data[q->rear]=e;
return true;
}
(5)出队列 deQueue(s,e)。
bool deQueue(SqQueue * &q,ElemType &e)
{
if(q->front == q->rear)
return false;
q->front ++;
e=q->data[q->front];
return true;
}
例题:
#include<stdio.h>
#include<Windows.h>
typedef int ElemType;
#define MaxSize 5
typedef struct
{
ElemType data[MaxSize]; //存放队中元素
int front; //队头指针
int rear; //队尾指针
}SqQueue; //定义顺序队类型
void InitQueue(SqQueue * &q)
{
q=(SqQueue*)malloc(sizeof(SqQueue));
q->front = q->rear = -1;
}
void DestoryQueue(SqQueue * &q)
{
free(q);
}
bool QueueEmpty(SqQueue * &q)
{
return (q->front == q->rear);
}
bool enQueue(SqQueue * &q,ElemType e)//进队列
{
if(q->rear == MaxSize-1)
return false;
q->rear ++;
q->data[q->rear]=e;
return true;
}
bool deQueue(SqQueue * &q,ElemType &e)
{
if(q->front == q->rear)
return false;
q->front ++;
e=q->data[q->front];
return true;
}
int main()
{
int a,i,e;
SqQueue *st;
InitQueue(st);
for(i=0;i<MaxSize;i++)
{
scanf("%d",&a);
enQueue(st,a);
}
for(i=0;i<MaxSize;i++)
{
deQueue(st,e);
printf("%d ",e);
}
system("pause");
return 0;
}