用循环队列输出杨辉三角形貌似有点小题大做,但主要是为了练习队列应用嘛。说实在这个小程序也让我调试了很长时间.
用这个程序用户就可以自行输入想要的杨辉三角形的行数了。
//YHTriangle.cpp
//输出杨辉三角形
//算法思想:首先在循环队列中存放第三行的 1,2,1和第四行的1.
//若循环队列队头元素和队头第二个元素均为1,则从队头删除一个1,在队尾插入两个1.
//若不然,将队对头元素和队头第二个元素相加,将和值插入到队尾,删除对头一个元素。
//若想输出杨辉三角形n行,将循环队列长度设置成 n+2。
//输出:前两行直接输出。定义了print函数控制后面每行输出的元素个数
#include "Queue.h"
#include "CycQueue.h"
#include <iostream>
using namespace std;
//输出n个空格
void print_space(int n);
//n行杨辉三角形的输出格式
void print(int k, int n);
int main()
{
int n;
cout << "Please enter the YangHui Triangle row number n:";
cin >> n;
CycQueue<int> YHTri(n+2);
YHTri.push(1);
YHTri.push(2);
YHTri.push(1);
YHTri.push(1);
//输出前两行
print(1,n);
print(1,n);
print(1,n);
while( !YHTri.full())
{
int a,b;
//若队头元素和队头第二个元素均为1
if( (YHTri.top() == 1) && (YHTri.second() == 1))
{
a = YHTri.pop_top();
YHTri.push(1);
YHTri.push(1);
print(a,n);
}
//若不然
else
{
a = YHTri.pop_top();
b = YHTri.top();
YHTri.push(a + b);
print(a,n);
}
}
//输出循环队列中留存的元素
while( !YHTri.empty())
{
print(YHTri.pop_top(),n);
}
system("pause");
return 0;
}
void print_space(int n) //输出n个空格
{
while(n--) cout << " ";
}
int i = 1, j = 0;
void print(int k, int n) //n行杨辉三角形的输出格式
{
if( i==1 ) print_space(n);
if(j++ != i) ;
else
{
cout << endl;
print_space(n-i);
++i;
j = 1;
}
cout << k <<" ";
}
//循环队列的模板类声明
#ifndef CYCQUEUE_H
#define CYCQUEUE_H
#include <iostream>
using namespace std;
template<class T>
class CycQueue:public Queue<T>
{
public:
CycQueue(int maxsz = 100):len(maxsz)
{
elems = new T[maxsz];
front = rear = 0;
};
~CycQueue(){delete[] elems; };
void clear() {rear = front = 0;};
int size()const
bool full()const
bool empty()const
bool push(const T& item);
bool pop();
T top()const;
T pop_top();
T second()const;
protected:
private:
int front;
int rear;
int len;
T* elems;
};
#include "CycQueue.cpp"
#endif
循环队列主要注意不要忘记%len,不然就都是莫名错误啦!
文章来源:http://liyuxia-life.spaces.live.com/Blog/cns!DA1B364675ACF35!271.entry