利用循环队列的数据结构:
//"CirQueue.h"
#include<iostream>
using namespace std;
template<class T>
class CirQueue
{
private:
T *base;
int front;
int rear;
int queuesize;
public:
CirQueue(int m);
~CirQueue();
void EnQueue(T x);
T DeQueue();
T GetHead();
T GetLast();
bool QueueEmpty();
bool QueueFull();
void ClearQueue();
void Pointer();
void QueueTranverse();
};
template<class T>
CirQueue<T>::CirQueue(int m)
{
base=new T[m];
if(base==NULL)
{
cout<<"队创建失败,退出!"<<endl;
exit(1);
}
front=rear=0;
queuesize=m;
}
template<class T>
CirQueue<T>::~CirQueue()
{
delete[] base;
rear=0;
front=0;
queuesize=0;
}
template<class T>
void CirQueue<T>::EnQueue(T x)
{
if((rear+1)%queuesize==front)
throw "上溢,无法入队";
base[rear]=x;
rear=(rear+1)%queuesize;
}
template<class T>
T CirQueue<T>::DeQueue()
{
T x;
if(front==rear)
throw "下溢,不能出队";
x=base[front];
front=(front+1)%queuesize;
return x;
}
template<class T>
T CirQueue<T>::GetHead()
{
T x;
if(front==rear)
throw "队空,队顶无元素";
x=base[front];
return x;
}
template<class T>
T CirQueue<T>::GetLast()
{
T x;
if(front==rear)
throw "队空,队尾无元素";
x=base[rear-1];
return x;
}
template<class T>
bool CirQueue<T>::QueueEmpty()
{
if(front==rear)
return true;
else
return false;
}
template<class T>
bool CirQueue<T>::QueueFull()
{
if((rear+1)%queuesize==front)
return true;
else
return false;
}
template<class T>
void CirQueue<T>::ClearQueue()
{
front=rear=0;
}
template<class T>
void CirQueue<T>::Pointer()
{
cout<<"队头front="<<front<<endl;
cout<<"队尾rear="<<rear<<endl;
}
template<class T>
void CirQueue<T>::QueueTranverse()
{
int i=front;
while(i!=rear)
{
if (base[i] != 0)
cout<<base[i]<<' ';
i=(i+1)%queuesize;
}
cout<<endl;
}
初始化队列,0、1入队。入队一个0,遍历队列输出,对队头两个元素求和,出队一个元素然后将和入队;循环执行上述操作rmax次。
#include<iostream>
#include"CirQueue.h"
using namespace std;
int main()
{
int rmax;
cout << "输入rmax:" << endl;
cin >> rmax;
CirQueue<int> yh(rmax + 3);//虽然只存储了rmax+2个元素,但由于使用的是循环队列,在存储时要少用一个空间用于判断队满队空,如果只申请rmax+2个内存会上溢报错
yh.EnQueue(0);
yh.EnQueue(1);
for (int i = 0; i < rmax; i++)
{
yh.EnQueue(0);
for (int blank = 0; blank < rmax - i - 1; blank++)//输出格式控制:每行开头加空格
cout << ' ';
yh.QueueTranverse();
for (int j = 0; j < i + 2; j++)
{
int first = yh.DeQueue();
int second = yh.GetHead();
yh.EnQueue(first + second);
}
}
return 0;
}