循环链表
- 将data[0]和data[MaxLen-1]视为相邻单元,首尾相接,形成一个逻辑意义的环(非物理上的)。
当rear=Maxlen-1时,再插入一个元素,让rear=0;
[(https://img-blog.csdn.net/20161217202948591?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQUpESjI2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) - 同样,front=MaxLen-1时,再删除一个元素,也让front=0;
形成逻辑上的循环。
循环顺序队列示意图
- 【分析】杨辉三角的规律是:
第1行1个数字,…,第n行有n个数字;
每行的第一和最后一个数是1;
从第3行开始,除了首尾的1,其余的数是上一行对应位置的左、右两个数的和。
例如,第7行的第3个数15是第6行中的第2和第3两个数5和10的和。
由这一规律可知,我们可用上一行的数来求出对应位置的下一行的内容。
为此,可用队列来保存上一行的内容。
每当由上一行的两个数求出下一行的一个数时,其中的前一个数便需要出队(删除),而新求出的数就要入队(插入)。 - 下为代码:
#define MaxLen 100
class Queue
{
public:
Queue();//初始化
virtual ~Queue();
void initlist();//录入
bool empty(); //判断队空
bool full(); //判断队满
bool getFront(int &x); //取队头元素
bool enQueue(int x); //入队
bool outQueue(); //出队
//其它运算(操作);
void YanghuiTri(int num);//num表示要显示的行数
//private:
int lenth;
int data[MaxLen]; //存放队列元素
int front, rear; //队头和队尾指针(数组下标)
//其它数据成员;书中的count成员是非必需的
};
#include "stdafx.h"
#include "Queue.h"
#include "iostream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Queue::Queue()//创建空队列 初始化
{
front=0; //初始首尾指针都指向0
rear=0;
}
Queue::~Queue()
{
}
void Queue::initlist()//录入
{
printf("please input some 数:\n");
int i=0;
while(EOF!=scanf("%d",&data[i])) //输入数
{
i++;
if(getchar()=='\n')
break;
}
lenth = i-1;
printf("data[lenth]= %d\n",data[lenth]);
}
bool Queue::empty()//判队空
{
if(front==rear)
return true; //队空,返回true
else
return false; //队不空,返回false
//可用简化写法:return (front==rear);
}
bool Queue::full()//判队满
{
if( (rear+1)%MaxLen == front ) //关键
return true; //队满
else
return false; //队未满
//简写:return ( (rear+1)%MaxLen == front );
}
bool Queue::getFront( int &x )// 取队头
{
if(front==rear)
return false; //队空,取队头失败,返回false
else
{
x=data[ (front+1)%MaxLen ]; //队头元素取到变量x。
//front指示的下一个单元才是队头元素,所以加1
return true; //取队头成功,返回true
}
}
bool Queue::enQueue(int x)//入队
{
if( (rear+1)%MaxLen==front )
return false; //队满,入队失败,返回false
else
{
data[rear]=x; //插入元素
rear=(rear+1)%MaxLen;
//队尾指针先后移一个单元。
return true; //插入成功,返回true。
}
}
bool Queue::outQueue()//出队
{
if( front==rear )
return false; //队空,出队失败,返回false
else
{
front=(front+1)%MaxLen;
//队头指针后移一个单元,元素并未真正删除
return true; //出队成功,返回true
}
}
void Queue::YanghuiTri(int num)//num表示要显示的行数
{
// MyQuen<int> mq;
int x,k;
for(int i=0;i <=num;i++)//表示行
{
if(i>0) //居中
{
for(k=0;k<=num-i;k++)
cout<<" ";
}
for(int j = 0;j <= i;j++)//表示列
{
if(j == 0)
{
enQueue(1);//第一个元素将1加入队列
// mq.AddElem(1);
}
else if(j == i)
{
enQueue(1);//每行最后一个将1入队列
// mq.AddElem(1);
// mq.DeleElem(x);//将上一行最后一个出队
// cout<<front<<" ";
cout<<data[front]<<" ";
outQueue();//出队
cout<<"第"<<i<<"行"<<endl;
}
else
{
// mq.DeleElem(x);//出队上一行
x=data[front];
if(data[front]>9)
cout<<data[front]<<" ";
else
cout<<data[front]<<" ";
outQueue();//出队
// cout<<x<<" ";
// mq.AddElem(x+mq.GetFrontVal());//将此时队首元素+刚出队的元素入队
enQueue(x+data[front]);
}
}
}
}
#include "stdafx.h"
#include "Queue.h"
#include "iostream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Queue::Queue()//创建空队列 初始化
{
front=0; //初始首尾指针都指向0
rear=0;
}
Queue::~Queue()
{
}
void Queue::initlist()//录入
{
printf("please input some 数:\n");
int i=0;
while(EOF!=scanf("%d",&data[i])) //输入数
{
i++;
if(getchar()=='\n')
break;
}
lenth = i-1;
printf("data[lenth]= %d\n",data[lenth]);
}
bool Queue::empty()//判队空
{
if(front==rear)
return true; //队空,返回true
else
return false; //队不空,返回false
//可用简化写法:return (front==rear);
}
bool Queue::full()//判队满
{
if( (rear+1)%MaxLen == front ) //关键
return true; //队满
else
return false; //队未满
//简写:return ( (rear+1)%MaxLen == front );
}
bool Queue::getFront( int &x )// 取队头
{
if(front==rear)
return false; //队空,取队头失败,返回false
else
{
x=data[ (front+1)%MaxLen ]; //队头元素取到变量x。
//front指示的下一个单元才是队头元素,所以加1
return true; //取队头成功,返回true
}
}
bool Queue::enQueue(int x)//入队
{
if( (rear+1)%MaxLen==front )
return false; //队满,入队失败,返回false
else
{
data[rear]=x; //插入元素
rear=(rear+1)%MaxLen;
//队尾指针先后移一个单元。
return true; //插入成功,返回true。
}
}
bool Queue::outQueue()//出队
{
if( front==rear )
return false; //队空,出队失败,返回false
else
{
front=(front+1)%MaxLen;
//队头指针后移一个单元,元素并未真正删除
return true; //出队成功,返回true
}
}
void Queue::YanghuiTri(int num)//num表示要显示的行数
{
// MyQuen<int> mq;
int x,k;
for(int i=0;i <=num;i++)//表示行
{
if(i>0) //居中
{
for(k=0;k<=num-i;k++)
cout<<" ";
}
for(int j = 0;j <= i;j++)//表示列
{
if(j == 0)
{
enQueue(1);//第一个元素将1加入队列
// mq.AddElem(1);
}
else if(j == i)
{
enQueue(1);//每行最后一个将1入队列
// mq.AddElem(1);
// mq.DeleElem(x);//将上一行最后一个出队
// cout<<front<<" ";
cout<<data[front]<<" ";
outQueue();//出队
cout<<"第"<<i<<"行"<<endl;
}
else
{
// mq.DeleElem(x);//出队上一行
x=data[front];
if(data[front]>9)
cout<<data[front]<<" ";
else
cout<<data[front]<<" ";
outQueue();//出队
// cout<<x<<" ";
// mq.AddElem(x+mq.GetFrontVal());//将此时队首元素+刚出队的元素入队
enQueue(x+data[front]);
}
}
}
}