队列打印杨辉三角,不懂啊,急
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列打印杨辉三角,不懂啊,急相关的知识,希望对你有一定的参考价值。
如何把这个程序不用模板写出来?以及ostream& operator<<(ostream& os,SepQueue<T>& Q)这个函数的意义是什么?想要去掉模板,不是简单的把T改成int,或float等,我改过,好像不对呀!谢谢高手了!
#include<iostream.h>
#include<stdio.h>
#include<assert.h>
const int maxSize=100;
//enum boolfalse,true;
template<class T>
class Queue
public:
Queue();
~Queue();
virtual bool EnQueue(const T& x)=0;
virtual bool DeQueue(T& x)=0;
virtual bool getFront(T& x)=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual int getSize()const=0;
;
template<class T>
class SepQueue: public Queue<T>
public:
SepQueue(int sz=10);
~SepQueue()delete[] elements;
bool EnQueue(const T& x);
bool DeQueue(T& x);
bool getFront(T& x);
void makeEmpty()front=rear=0
bool IsEmpty()constreturn (front==rear)?true:false;
bool IsFull()constreturn((rear+1)%maxSize==front)?true:false;
int getSize()constreturn(rear-front+maxSize)%maxSize;
friend ostream& operator<<(ostream& os,SepQueue<T>& Q)
protected:
int rear,front;
T *elements;
int maxSize;
;
template<class T>
SepQueue<T>::SepQueue(int sz):front(0),rear(0),maxSize(sz)
elements=new T[maxSize];
assert(elements!=NULL);
;
template<class T>
bool SepQueue<T>::EnQueue(const T& x)
if(IsFull()==true) return false;
elements[rear]=x;
rear=(rear+1)%maxSize;
return true;
;
template<class T>
bool SepQueue<T>::DeQueue(T& x)
if(IsEmpty()==true) return false;
x=elements[front];
front=(front+1)%maxSize;
return true;
;
template<class T>
bool SepQueue<T>::getFront(T& x)
if(IsEmpty()==true) return false;
x=elements[front];
return true;
;
template<class T>
ostream& operator<<(ostream& os,SepQueue<T>& Q)
os<<"front="<<Q.front<<",rear="<<Q.rear<<endl;
for(int i=front;i!=rear;i=(i+1)%maxSize;)
os<<i<<":"<<Q.elements[i]<<endl;
return os;
;
void YangVI(int n)
SepQueue<int> q(n+2);
int i=1,j,s=0,k=0,t,u;
q.EnQueue(i); q.EnQueue(i);
for(i=1;i<=n;i++)
cout<<endl;
q.EnQueue(k);
for(int f=i;f<n;f++)
cout<<' ';
for(j=1;j<=i+2;j++)
q.DeQueue(t);
u=s+t; q.EnQueue(u);
s=t;
if(j!=i+2) cout<<s<<' ';
cout<<endl;
;
void main()
int n;
cout<<"输入行数"<<endl;
cin>>n;
YangVI(n);
杨辉三角那个函数的意思我也不懂呀!帮忙写写每句的意思吧,非常非常感谢
void YangVI(int n)
SepQueue<int> q(n+2); //第n行只有n+1个元素,所以设队列容量为n+2没问题
int i=1,j,s=0,k=0,t,u;
q.EnQueue(i); q.EnQueue(i);//先将第一行两个1入队列
for(i=1;i<=n;i++)
cout<<endl;
q.EnQueue(k); //k始终是0,这步相当于在上一行的最右边加了个0,保证当前行的最右边的1,可以用上一行的1+0得到
for(int f=i;f<n;f++)
cout<<' '; //每行前面都要输出一定的空格,以保证三角形输出时左右对称
for(j=1;j<=i+2;j++)
q.DeQueue(t);//取出上一行的元素(第一个肯定是1,最后一个是0)
u=s+t; //s初始化为0,而且下面的s=t这句在循环最后一步时,因为t是0,所以s又还原为0,以保证每一行第一个1,由上一行的1和添加的0相加得到.
q.EnQueue(u); //和入队列
s=t; //s存放刚才相加的两个数中右边那个,在下一个加法操作时正好用作左边的加数
if(j!=i+2) cout<<s<<' '; //输出上一行的元素,其中最后一个0不能输出
cout<<endl;
; 参考技术A 用数组解决啊
public class YangHui
public static void main(String args[])
int i,j,space,n;
n=10;//为了省事,没有从命令行参数取值。
int a[][]=new int[n][];
a[0]=new int[1];
for(i=1;i<n;i++) a[i]=new int[i+1];
a[0][0]=1;
for(i=1;i<n;i++)
a[i][0]=1;//行首1
a[i][a[i].length-1]=1;//行尾1
for(j=1;j<a[i].length-1;j++) //肩上两数之和
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<n;i++)
for(space=n-i;space>0;space=space-1)
System.out.print("\t");
for(j=0;j<a[i].length;j++)
System.out.print(a[i][j]+"\t\t");
System.out.println();
参考技术B 不懂
杨辉三角队列的实现 利用循环顺序队列打印杨辉三角。杨辉三角的特点是两个腰上的数字都为1,其它位置上的
利用循环顺序队列打印杨辉三角。杨辉三角的特点是两个腰上的数字都为1,其它位置上的数字是其上一行中与之相邻的两个整数之和。所以在打印过程中,第i行上的元素要由第i-1行中的元素来生成。在循环队列中依次存放第i-1行上的元素,然后逐个出队并打印,同时生成第i行元素并入队列。打印的杨辉三角形如下所示:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
#define N 11
void main()
int i,j,a[N][N];
for(i=1;i<N;i++)
a[i][i]=1;
a[i][1]=1;
for(i=3;i<N;i++)
for(j=2;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<N;i++)
for(j=1;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");
参考技术B #include <stdio.h>
#define K 10
void main()
int i,j,a[K][K];
for(i=1;i<K;i++)
a[i][i]=1;
a[i][1]=1;
for(i=3;i<K;i++)
for(j=2;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i<K;i++)
for(j=1;j<=i;j++)
printf("%5d",a[i][j]);
参考资料:C++6编程书原题
参考技术C 根本不必以上是关于队列打印杨辉三角,不懂啊,急的主要内容,如果未能解决你的问题,请参考以下文章