队列的顺序实现定义
队列的定义和顺序表、顺序栈其实差不多,只不过有两个变量来记录队列头,尾,操作不尽相同,队列只能在尾部插入,头部退列
typedef struct
{
int data[MaxSize];
int front,rear; //队头队尾
}SqQueue;
队列初始化
void InitSqQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
}
判断队满
bool IsQueueFull(SqQueue Q)
{
if((Q.rear+1)%MaxSize==Q.front)
return true;
else
return false;
}
判断队空
bool IsQueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return true;
else
return false;
}
创建队列
bool CreateSqQueue(SqQueue *Q)
{
int data;
printf("请输入整数:");
scanf("%d",&data);
Q->front=9; //从中间开始队列
Q->rear=9;
int i=Q->front;
while(data!=9999&&!IsQueueFull(*Q))
{
Q->data[i]=data;
Q->rear=(Q->rear+1)%MaxSize;
i=(i+1)%MaxSize;
printf("请输入整数:");
scanf("%d",&data);
}
return true;
}
打印队列
void PrintSqQueue(SqQueue Q)
{
int startid=Q.front;
int endid=Q.rear;
while(startid!=endid)
{
printf("Q.data[%d]=%d\n",startid,Q.data[startid]);
startid=(startid+1)%MaxSize;
}
}
入队
bool EnQueue(SqQueue *Q,int e)
{
if(IsQueueFull(*Q))return false;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
return true;
}
退队
int DeQueue(SqQueue *Q)
{
if(IsQueueEmpty(*Q))return false;
int e=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
return e;
}
测试代码
int main(int argc, char* argv[])
{
SqQueue Q;
InitSqQueue(&Q);
CreateSqQueue(&Q);
PrintSqQueue(Q);
printf("EnQueue(&Q,999)\n");
EnQueue(&Q,999);
PrintSqQueue(Q);
int e=DeQueue(&Q);
printf("DeQueue(&Q)=%d\n",e);
PrintSqQueue(Q);
//printf("11求余10=%d",11%10);
}
测试结果
请输入整数:11
请输入整数:22
请输入整数:33
请输入整数:44
请输入整数:55
请输入整数:66
请输入整数:9999
Q.data[9]=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
EnQueue(&Q,999)
Q.data[9]=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
Q.data[5]=999
DeQueue(&Q)=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
Q.data[5]=999
Press any key to continue