队列:操作受限的线性表,只允许在表的一端插入,另一端删除
常见操作
InitQueue(&Q):
初始化队列,创造空队列
QueueEmpty(Q):
判空
EnQueue(&Q,x):
入队,若队列未满,将x加入成为队尾元素
DeQueue(&Q,&x):
出队,若队列非空,删除队头元素并用x返回
GetHead(Q,&x):
读队头元素,若队列Q非空,将对头元素赋给x
顺序存储的实现
#define Maxsize 10
struct typedef{
Elemtype data[Maxsize]; //存放队列元素
int front,rear; //队头队尾指针
}SqQueue;
void testQueue()
{
SqQueue Q; //声明一个队列(顺序储存)
}
void InitQueue(SqQueue &Q)
{
Q.rear=Q.front=0; //初始化一个队列
}
bool QueueEmpty(SqQueue Q)
{
if(Q.rear == Q.front)
return true;
else
return false ;
} //判空
bool EnQueue(SqQueue &Q,Elemtype x)
{
if(队满) //队满报错
return false;
Q.data[Q.rear] = x; // 先赋值再加
Q.rear=(Q.rear+1)%Maxsize //循环队列
return true ;
} //入队
bool DeQueue(SqQueue &Q,Elemtype &x)
{
if(Q.rear==Q.front)
return false;
x=Q.data(Q.front);
Q.front=(Q.front+1)%Maxsize;
return true;
} //出队
bool GetHead(SqQueue Q,Elemtype %x)
{
if(Q.rear == Q.front)
return false;
x = Q.data[Q.front];
return true;
} // 读取队首元素
使用循环队列会出现浪费一个存储空间问题
为了区分队空和队满少用一个队列单元
解决方法
1.在类型中增设表示数据元素的数据成员
队空条件变成 Q.size = 0;
队满条件为 Q.size = Maxsize;
2.增设tag数据成员 tag
表示入队或者出队
入队增加成员 tag = 1;
出队删除成员 tag = 0;
这样 当Q.front == Q.rear
时 如果tag == 1
则队满 如果tag == 0
则队空