这部分内容关于队列的顺序存储,关键点在于对于队空及队满这两种情况的处理,主要有以下三种方式:

  1. 牺牲一个存储数据单元用以区分
  2. 类型中增设表示元素个数的数据成员
  3. 类型中增设tag数据成员用以区分

下文采用了第一种形式。



#include<stdio.h>

#define MaxSize 50

typedef struct{
int data[MaxSize];
int front,rear;//队首和队尾指针
}SqQueue;

/* -1-初始化循环队列*/
void InitQueue(SqQueue &Q){
Q.rear = Q.front = 0;//初始化队首、队尾指针
}

/* -2- 判断是否队空*/
bool isEmpty(SqQueue Q){
if(Q.rear == Q.front)
{
return true;
}
else
{
return false;
}
}

/* -3- 入队(插入元素)*/
bool EnQueue(SqQueue &Q,int e){
if((Q.rear+1) % MaxSize == Q.front)
{
printf("队满!\n");
return false;
}
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize; //队尾指针加一取模
return true;
}

/* -4- 出队*/
bool DeQueue(SqQueue &Q,int &e){
if(isEmpty(Q)){
return false;
}
else{
e = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
}
return true;
}


int main(){
SqQueue Q;
InitQueue(Q);

printf("*请输入队列长度:\n");
int e,length,temp,i=1;
scanf("%d",&length);
temp = length;
printf("\n*请依次输入%d个元素\n",length);
while(length > 0){
printf("请输入第%d个元素:\n",i);
scanf("%d",&e);
EnQueue(Q,e);
length--;
i++;
}
printf("\n*请进行选择:\n");
printf("==============\n\n");
printf("==1.循环出队\n");
printf("==2.当前队首、队尾元素\n");
int flag;
scanf("%d",&flag);
switch(flag){
case(1):
{
printf("\n当前队列为:\n");
while(temp > 0){
int e;
if(temp != 1)
{
printf("%d->",Q.data[Q.front]);
}
else
{
printf("%d",Q.data[Q.front]);
}

DeQueue(Q,e);
temp--;
}
break;
}
case(2):
{
printf("循环队列队尾不存放数据,因此当前队尾前一个位置的元素为:%d\n",Q.data[Q.rear-1]);
printf("当前队首元素为:%d\n",Q.data[Q.front]);
}
}
return 0;
}


最终结果:

数据结构考研复习(循环队列)_出队

 

 数据结构考研复习(循环队列)_循环队列_02