目录
基础知识
队列:
操作特性:先进先出
队头(Front):允许删除的一端
队尾(Rear):允许进入的一端
空队列:不含任何元素的空表
队列的顺序存储(以循环队列为主)
队列图例
a->b 入队a、b、c、d、e
b->c 出队 a
c->d 出队 b、c、d
循环队列图例
*循环队列能储存的数据比实际最大空间小1(需用1空间判断队列满空与否)
队列/循环队列的定义
#define MaxSize 5//定义队列中元素的最大个数
typedef struct SqQueue{
ElemType data[MaxSize];//定义数组存放栈中元素(最大存储MaxSize-1个)
int front,rear;//定义队头指针、 队尾指针
}SqQueue;//队列的类型定义(队列的别名)
SqQueue (Q);//定义队列
初始化
void InitQueue(SqQueue &Q)//初始化队列指针
{
Q.rear=Q.front=0;//代表队列为空
}
InitQueue(Q);
判空
bool isEmpty(SqQueue &Q)//判断队是否为空
{
if(Q.rear==Q.front)//队空
return true;
else
return false;//非空
}
ret=isEmpty(Q);
if(ret)
{
printf("队列为空\n");
}
else
{
printf("队列不为空\n");
}
入队(循环队列)
bool EnQueue(SqQueue &Q,ElemType x)//进队(将x放入队Q中)
{
if((Q.rear+1)%MaxSize==Q.front) //判断是否队满
return false;//队满,报错
Q.data[Q.rear]=x;//将x赋给队尾元素
Q.rear=(Q.rear+1)%MaxSize;//队尾指针加一取(最大空间)模 (取模保证指针在队列中循环)
return true;//入队成功
}
EnQueue(Q,x);//将x放入队Q中
出队(循环队列)
bool DeQueue(SqQueue &Q,ElemType &x)//出队(将x从队Q中取出)
{
if(Q.rear==Q.front) //判断是否队空
return false;//队空,报错
x=Q.data[Q.front];//将队头元素赋给x
Q.front=(Q.front+1)%MaxSize;//队头指针加一取(最大空间)模 (取模保证指针在队列中循环)
return true;//出队成功
}
DeQueue(Q,x)//将x从队Q中取出