/*队列的顺序存储描述*/ #define MaxSize 50 typedef struct{ int data[MaxSize]; int front,rear; }SqQueue;
一般判断队空还是队满的方法: 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,这是一种普遍的做法约定
队满条件
(Q.rear +1) %MaxSize == Q.front
队空条件
Q.front == Q.rear
队列中元素的个数
(Q.rear - Q.front + MaxSize)% MaxSize
循环队列的操作
(1)初始化
void InitQueue(SqQueue Q) { Q.rear = Q.front = 0; //初始化队首.队尾指针 }
(2)判断空
bool isEmpty(SqQueue Q){ if(Q.front == Q.rear) return true; //队空条件 else return false; }
(3)入队
bool EnQueue(SqQueue &Q , int x){ if( (Q.rear +1) %MaxSize == Q.front) return false //队满 /*先把元素放入队列,再把rear指针往后移*/ Q.data[rear] = x; Q.rear = (Q.rear +1) % MaxSize; return true; }
(4)出队
bool DeQueue(SqQueue &Q , int &x){ if(Q.front == Q.rear ) return false; /*和入队类似,先把队首元素取出,再把front指针加一*/ x = Q.data[front]; Q.front = (Q.front+1) %MaxSize; return true; }