打印二项式系数表(即杨辉三角)
1
1 2 1
1 3 3 1
1 4 6 4 1
系数表中的第K行有k+1个数,除了第一个数和最后一个数为1外,其余的数则为上一行中位其左右的两数之和。
如果要求计算并输出杨辉三角前N行的值,则队列的最大空间应为n+2(第N行有n+1个数,且根据循环队列的特性:“少用一个元素”,但在这里少用的那个元素用来存放临界值“0”)。
#include"QueueSq.cpp"
void InitQueue(SqQueue &Q,int n)
{
Q.elem=new QElemType[n];
//为循环队列分配空间(比实际能用多一个元素)
Q.queuesize=n;
Q.incrementsize=QUEUEINCREMENT;
Q.top=Q.rear=0;
}
void YangHui(int n)
{
SqQueue Q;
int i,k;
for(i=1;i<=n;i++)
cout<<" ";
cout<<"1"<<endl;//在中心位置输出杨辉三角形的最顶端的1
InitQueue(Q,n+2);//设置最大容量为n+2的空队列,且因为循环队列的创建队列的函数不含int型参数,所以定义调用了InitQueue()函数来创建空队列
EnQueue_Sq(Q,0);//添加临界值0
EnQueue_Sq(Q,1);
EnQueue_Sq(Q,1);//第一行的值入队列
k=1;//k表示行数
QElemType e,s;
while(k<n)
{
for(i=1;i<=n-k;i++)
cout<<" ";
EnQueue_Sq(Q,0);//行界值0入队
do
{
DeQueue_Sq(Q,s);
GetHead_Sq(Q,e);
if(e)
cout<<e<<" ";//若e为非0值,则打印输出e的值并加一空格
else
cout<<endl;//否则换行,为下一行的输出做准备
EnQueue_Sq(Q,s+e);
}while(e!=0);
k++;
}
DeQueue_Sq(Q,e);
QueueTraverse_Sq(Q);
}
int main()
{
int n;
printf("n=");
scanf("%d",&n);
YangHui(n);
return 0;
}
循环队列的基本操作函数:
//在利用顺序分配存储结构实现队列时,除了用一维数组描述队列中的数据元素的存储区域,需设立两个指针Top,rear
//指示队头和队尾的位置,为叙述方便,在此约定:初始化建立空队列时,另top=rear=0,每当插入一个元素后,尾指针rear+1,
//每当删除一个元素时top+1,头指针始终指向队头元素,而尾指针始终指向队尾元素的“下一个”位置。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef int QElemType;
#define QUEUEINCREMENT 10
struct SqQueue
{
QElemType *elem;
int top;
int rear;
int queuesize;
int incrementsize;
};
#define QUEUE_INIT_SIZE 100
void InitQueue_Sq(SqQueue &Q)
{
Q.elem=new QElemType[QUEUE_INIT_SIZE+1];
//为循环队列分配空间(比实际能用多一个元素)
Q.queuesize=QUEUE_INIT_SIZE+1;
Q.incrementsize=QUEUEINCREMENT;
Q.top=Q.rear=0;
}
void EnQueue_Sq(SqQueue &Q,QElemType e)
{
//插入元素e为Q的新的队尾元素
if((Q.rear+1)%Q.queuesize==Q.top)//队满的判断
{
QElemType *a;
a=new QElemType [Q.queuesize+Q.incrementsize];
for(int k=0;k<Q.queuesize-1;k++)
a[k]=Q.elem[(Q.top+k)%Q.queuesize];//腾挪原循环队列中的数据元素
delete Q.elem;
Q.elem=a;
Q.top=0;
Q.rear=Q.queuesize-1;
Q.queuesize+=Q.incrementsize;
}
Q.elem[Q.rear]=e;
Q.rear=(Q.rear+1)%Q.queuesize;//入队,rear表示真正队尾的下一个元素的下标
}
int QueueLength_Sq(SqQueue Q)
{
return (Q.top+Q.queuesize-Q.rear)%Q.queuesize;
}
bool DeQueue_Sq(SqQueue &Q,QElemType &e)
{
if(Q.top==Q.rear)
return false;//空队列
e=Q.elem[Q.top];
Q.top=(Q.top+1)%Q.queuesize;
return true;
}
void ClearQueue_Sq(SqQueue &Q)
{
Q.top=Q.rear=0;
}
void DestroyQueue_Sq(SqQueue &Q)
{
delete Q.elem;
Q.elem=NULL;
Q.top=Q.rear=0;
}
bool QueueEmpty_Sq(SqQueue Q)
{
if(Q.top==Q.rear)
return true;
return false;
}
void GetHead_Sq(SqQueue Q,QElemType &e)
{
e=Q.elem[Q.top];
}
void QueueTraverse_Sq(SqQueue Q)
{
int i=Q.top;
while(i!=Q.rear)
{
cout<<Q.elem[i]<<" ";
i=(i+1)%Q.queuesize;
}
printf("\n");
}
该算法的时间复杂度为O(n*n),因为外循环的次数为n-1,内循环的次数分别为3,4,5,…………