队列的基本概念及顺序实现
队列的基本概念
队列的定义
队列(Queue)简称队,也是一宗操作受限的线性表,只允许在表的一段进行插入,而在表的另一端进行删除。向队列中插入元素成为入队或进队;删除元素成为出队或离队。
特性:先进先出 (First In First Out,FIFO)
- 队头(Front): 允许删除的一端,也成为队首
- 队尾(Rear):允许插入的一段
- 空队列:不含任何元素的空表
队列常见的基本操作
InitQueue(&Q)
:初始化队列,构造一个空队列Q
QueueEmpty(Q)
:判队列空,若队列空返回true,否则返回false
EnQueue(&Q,x)
入队,若队列未满,则将x加入
DeQueue(&Q,&x)
出队,若队列非空,删除队头元素,并用x返回
GetHead(Q,&x)
读队头元素,若队列Q非空,则将队头元素赋值给x
队列的顺序存储结构
#define MaxSize 10 //定义队列中元素的最大个数
typedef struct{ElemType data[MaxSize]; //用静态数组存放队列元素int front,rear; //队头指针和队尾指针
}SqQueue;
//初始化队列
void InitQueue(SqQueue &Q){Q.rear = Q.front = 0;
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q){if(Q.rear == Q.front)return true;elsereturn false;
}
//入队
bool EnQueue(SqQueue &Q,ElemType x){if((Q.rear+1)%MaxSize == Q.front) //判断队满的条件return false; //队列满报错Q.data[Q.rear] = x; //将x插入队尾Q.rear = (Q.rear+1)%MaxSize;return true;
}
//出队
bool DeQueue(SqQueue &Q,ElemType &x){if(Q.rear == Q.rear)return false; //队空报错x=Q.data[Q.front]; Q.front=(Q.front+1)%MaxSize;return true;
}
//获得队头元素的值,并用x返回
bool GetHead(SqQueue Q,ElemType &x){if(Q.rear == Q.front)return false; //队空报错x=Q.data[Q.front];return true;
}
Q.rear == MaxSize
不能作为队列满的条件
队列已满的条件 队尾指针的下一个位置是队头指针,(Q.rear +1)%MaxSize == Q.front
求队列元素的个数 (rear + MaxSize-front)%MaxSize