队列
1.队列是特殊的线性表;
队列仅在线性表两端进行操作;
队头(Front):取出数据的一端;
队尾(Rear):放入数据的一端;
性质:先进先出
2.队列的抽象数据模型:
1)初始化操作,建立一个空队列Q;
2)若队列存在,则销毁它;
3)将队列清空
4)若队列Q为空,返回true,否则返回false;
5)若队列Q存在且非空,用e返回队列Q的队头元素;
6)若队列Q存在,插入新元素e到队列Q中,并成功称为队尾元素;
7)删除队列Q中队头元素,并用e返回其值;
8)返回队列Q的元素个数;
3.循环队列:
1.队列顺序存储的不足:
避免出现只有一个元素时,队头和队尾的重合处理麻烦,引入front指向队头元素,rear指向队尾元素的下一个位置;
front=rear时,队列不是还剩一个元素,而是空队列;
2.循环队列定义:把头尾相接的顺序存储结构称为循环队列;
判断队列满的条件:
(rear+1)%QueueSize==front;
通用的计算队列长度公式为:
(rear-front+QueueSize)%QueueSize;
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}SqQueue;
3.初始化一个空队列Q:
int InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return OK;
}
4.求队列长度:
int QueueLength(SqQueue Q)
{
return (Q.rear -Q.front+MAXSIZE)%MAXSIZE;
}
5.循环队列的入队列:
int EnQueue(SqQueue *Q, int e)
{
if((Q->rear+1)%MAXSIZE ==Q->front)
return ERROR;
Q->data[Q->rear] = e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
6.循环队列的出队列:
int DeQueue(SqQueue *Q, int *e)
{
if(Q->rear==Q->front)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}