?队列: 队列是一种先进先出(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 <stdio.h>
#include <stdlib.h>
#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<Q.rear;i++){
printf("%d ",Q.data[i]);
}
}
//void print_outSqQueue(SqQueue &Q){
// for(int i=;i<Q.rear;i++){
// printf("%d ",Q.data[i]);
// }
//
//}
int main(){
SqQueue Q;
ElemType e;
Init_SqQueue(Q);
EnQueue(Q);
printf("\n打印入队结果:\n");
printSqQueue(Q);
printf("\n");
printf("此时队列的长度为:%d\n",Length(Q));
OutQueue(Q);
printf("\n打印出队后队列:\n");
printSqQueue(Q);
printf("\n");
e=getQueueFront(Q);
printf("队头元素为:%d\n",e);
e=getQueueRear(Q);
printf("队尾元素为:%d\n",e);
printf("此时队列的长度为:%d\n",Length(Q));
if(isEmpty(Q)){
printf("队为空!\n");
}else{
printf("队非空!\n");
}
}
|