基础知识
队列(Queue):一种操作受限的线性表。队头(Front)允许删除,即出队;队尾(Rear)允许插入,即入队。FIFO。
循环队列:牺牲一个存储单元,使队列逻辑上首尾相接。
练习:
1. 定义
#include <stdio.h>
#define MaxSize 5
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];//数组,存储MaxSize-1个元素
int front,rear;//队列头,队列尾
}SqQueue;
2. 初始化和判空
void InitQueue(SqQueue &q){
q.front=q.rear=0;//初始化循环队列,就是把头和尾都指向零
}
//判断循环队列是否为空
bool isEmpty(SqQueue q){
return q.rear=q.front;
}
3. 入队
//入队
bool EnQueue(SqQueue &q,ElemType elem){
if((q.rear+1)%MaxSize == q.front){//判断循环队列是否满了
printf("EnQueue false\n");
return false;
}
q.data[q.rear]=elem;//放入元素
q.rear=(q.rear+1)%MaxSize;//rear要加1,大于数组下标则回到起点
return true;
}
4. 出队
//出队
bool DeQueue(SqQueue &q,ElemType &elem){
if(q.rear==q.front){//队列为空,无法出队
return false;
}
elem=q.data[q.front];//头部出队
q.front=(q.front+1)%MaxSize;
return true;
}
5. 主函数
int main() {
SqQueue Q;
InitQueue(Q);
bool ret;
ret = isEmpty(Q);
if(ret){
printf("SqQueue is Empty\n");
}else{
printf("SqQueue is not Empty\n");
}
printf("----------------------\n");
ElemType e1,element;
for(int i=0;i<5;i++) {
scanf("%d",&e1);
EnQueue(Q, e1);//入队
}
printf("----------------------\n");
while(Q.front !=Q.rear) {
DeQueue(Q, element);//出队
printf("%2d",element);
}
printf("\n");
return 0;
}