如果要求计算并输出杨辉三角前 n 行的值,;‘则队列的最大空间应为 n+2。假设队列中已存有第 k 行的计算结果,并为了计算方便,在两行之间添加一个“0”作为行界值,则在计算第 k+1 行之前,头指针正指向第 k 行的“0”,而尾元素为第 k+1 行的“0”。由此从左到右依次输出第 k 行的值,并将计算所得的第 k+1 行的值插入队列的基本操作为:
头文件:
#include<iostream>
#define QelemType int
#define MAXSIZE 100
typedef struct
{
QelemType* base;
int front;// 队列的头指针
int rear; // 队列的尾指针
}SqQueue;
void InitQueue(SqQueue& Q);
void DestoryQueue(SqQueue& Q);
bool EnQueue(SqQueue& Q, QelemType e);
QelemType GetHead(SqQueue& Q);
bool DeQueue(SqQueue& Q, QelemType& e);
QelemType GetLength(SqQueue &Q);
bool IsEmpty(SqQueue& Q);
void yanghui(int n);
资源文件:
#include"queue.h"
using namespace std;
void InitQueue(SqQueue& Q)
{
Q.base = (QelemType*)(malloc(MAXSIZE * sizeof(QelemType)));
if (!Q.base)
exit(-1);
Q.front = Q.rear = 0;
return;
}
bool EnQueue(SqQueue& Q, QelemType e)
{
// 若当前队列不满,这在当前队列的尾元素之后,插入元素 e 为新的队列尾元素,并返回TRUE,否则返回FALSE
if ((Q.rear + 1) % MAXSIZE == Q.front)
return false;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return true;
}
void DestoryQueue(SqQueue& Q)
{
delete(Q.base);
}
QelemType GetHead(SqQueue& Q)
{
if (Q.front == Q.rear)
exit(-1);
QelemType temp;
temp = Q.base[Q.front];
return temp;
}
bool DeQueue(SqQueue& Q, QelemType& e)
{
if (Q.front == Q.rear)
exit(-1);
e = Q.base[Q.front];
Q.front += 1;
}
QelemType GetLength(SqQueue& Q)
{
return Q.rear - Q.front;
}
bool IsEmpty(SqQueue& Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
bool IsFull(SqQueue& Q)
{
if ((Q.rear + 1) % MAXSIZE == Q.front)
return true;
else
return false;
}
void yanghui(int n)
{
SqQueue Q;
InitQueue(Q);
int e;
int k = 1;
int s;
for (int i = 1; i <= n; i++)
cout << ' ';
cout << '1'<<endl;// 在中心位置输出杨辉三角最顶端的"1"
EnQueue(Q, 0);// 添加行界值
EnQueue(Q, 1);
EnQueue(Q, 1); // 第一行的值入队列
while (k < n-1)
{// 通过循环队列输出前 n-1 行的值
for (int i = 1; i <= n - k; i++)
cout << ' ';// 输出n-k个空格以保持三角型
EnQueue(Q, 0); // 行界值"0"入队列
do { // 输出第 k 行,计算第 k+1 行
DeQueue(Q, s);
e = GetHead(Q);
if (e)
cout << e << ' ';// 若e为非行界值0,则打印输出 e 的值并加一空格
else
cout << endl; // 否则回车换行,为下一行输出做准备
EnQueue(Q,s+e);
} while (e != 0);
k++;
} // while
DeQueue(Q, e); // 行界值"0"出队列
while (!IsEmpty(Q))
{ // 单独处理第 n 行的值的输出
DeQueue(Q, e);
cout << e << ' ';
} // while
} // yanghui
main函数:
#include"queue.h"
using namespace std;
int main()
{
int n;
cin >> n;
SqQueue Q;
InitQueue(Q);
yanghui(n);
return 0;
}
时间复杂度o(n^2);