for(i=1;i<=N;++i)
{
for(j=0;j<30-3*i;++j)//打印每行前面的空格
printf(" ");
do
{
DeQueue();
GetHead();
if(e!=0) printf("%6d",e);
EnQueue();
}while(e!=0);
UpQueue();
puts("");//每行后回车换行
}
以n=4举例
结果为:
1 1
1 2 1
1 3 3 1
1 4 6 4 1
解析:
queue_size=n+2;//队列的最大容量queue_size=6(数组空间大小)
for(i=0;i<n-2;++i) queue[i]=0;//初始化
queue[i]=1,queue[i+1]=1,queue[i+2]=0;
front=i-1,rear=n+1;
初始化后的队列(queue数组):
front
0 0 1 1 0
rear
打印第一行(即for()循环中i=1)
DeQueue(); 删除队首元素,并将0赋值s 实际只将front向下移一位,front=2,即指向queue[2] GetHead(); 取队首元素,e= queue[front]= queue[2]=1
if(e!=0) printf("%6d",e); e!=0 打印e 即1
继续执行do……while语句因为e不为0
DeQueue(); 删除队首元素,并将queue[2]赋值s front=3
GetHead(); 取队首元素,e= queue[front]=queue[3]=1
if(e!=0) printf("%6d",e); e!=0 打印e 即1
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[0]=2 rear=1
继续执行do……while语句因为e不为0
DeQueue(); 删除队首元素,并将queue[3]赋值s front=4
GetHead(); 取队首元素,e= queue[front]=queue[4]=0
if(e!=0) printf("%6d",e); e==0 不执行printf()语句
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[1]=1 rear=2
此时e==0跳出do……while语句
即打印第一行完毕输出: 1 1
UpQueue(); 在队尾添加元素0 即queue[rear]=queue[2]=0 rear=3
队列为:
2 1 0 1 0 1
puts("");//每行后回车换行rear
front
打印第二行
DeQueue(); s=0 front=5
GetHead(); e=1
if(e!=0) printf("%6d",e); e!=0 打印e 即1
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[3]=1 rear=4
继续……
DeQueue(); s=1 front=6 对queue_size取模即指向queue[0] front=0
GetHead(); e=2
if(e!=0) printf("%6d",e); e!=0 打印e 即2
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[4]=3 rear=5
继续……
DeQueue(); s=2 front=1
GetHead(); e=1
if(e!=0) printf("%6d",e); e!=0 打印e 即1
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[5]=3 rear=6对queue_size取模即指向queue[0] rear=0
继续……
DeQueue(); s=1 front=2
GetHead(); e=0
if(e!=0) printf("%6d",e); e==0 不打印
EnQueue(); 在队尾添加元素s+e 此时queue[rear]=queue[0]=1 rear=1
此时e==0跳出do……while语句
即打印第二行完毕输出: 1 2 1
UpQueue(); 在队尾添加元素0 即queue[rear]=queue[1]=0 rear=2
队列为:
……
剩下依此类推……。