队列:
队列是一种先进先出(First In First Out,FIFO)的线性表。它只允许在表的一端进行插入,在另一端删除元素。
允许插入的一端成为队尾,允许删除的一端成为队头
假溢出:如果使用Q.rear = MAXSIZE作为判定队满的话,就会出现可能只有一个队尾元素一直后移的情况,也会出现还有很多空的空间
循环队列避免了假溢出的情况:
初始化:Q.front==Q.rear=0
队空:Q.front==Q.rear
队满:(Q.rear+1)%MAXSIZE==Q.front
队列长度:(Q.rear-Q.front+MAXSIZE)%MAXSIZE
为了区分队空队满:常用方法是:少用一个元素空间,及队列空间大小为m时,有m-1个元素就认为是满队。这样判断队空的条件不变,即当头尾指针的值相同时,则认为队空
还有:新增代表元素个数的变量;或者新增tag数据成员(0或1)
#include#include #define MAXSIZE 50 typedef int ElemType; typedef int Status; typedef struct { ElemType data[MAXSIZE]; //初始化时动态分配存储空间 int front; int rear; }SqQueue; //循环队列初始化 void Init_SqQueue(SqQueue &Q){ Q.front=Q.rear=0; printf("对初始化成功!n"); } //入队 bool EnQueue(SqQueue &Q){ ElemType e; if((Q.rear+1)%MAXSIZE==Q.front){//the queue is full return false; } printf("请输入入队元素:n"); scanf("%d",&e); while(e!=1111){ Q.data[Q.rear]=e; Q.rear=(Q.rear + 1) % MAXSIZE; //队尾指针加1,取模 scanf("%d",&e); } return true; } //出队*/ bool OutQueue(SqQueue &Q){ if(Q.front==Q.rear){ return false; } printf("%d出队n",Q.data[Q.front]); Q.front = (Q.front+1) % MAXSIZE; return true; } //取队头元素*/ ElemType getQueueFront(SqQueue Q){ if(Q.front!=Q.rear){ //非空 return Q.data[Q.front]; } } //取队尾元素*/ ElemType getQueueRear(SqQueue Q){ if(Q.front!=Q.rear){ Q.rear--; return Q.data[Q.rear]; } } //判断队是否为空 */ bool isEmpty(SqQueue &Q){ if(Q.front==Q.rear){//为空 return true; }else{ return false; } } //判断队是否已满 */ Status isFull(SqQueue &Q){ if((Q.rear+1)%MAXSIZE==Q.front){//已满 return true; }else{ return false; } } //队列长度 int Length(SqQueue &Q){ int len; len = (Q.rear-Q.front+MAXSIZE) % MAXSIZE; return len; } //打印 void printSqQueue(SqQueue &Q){ for(int i=Q.front;i



