数据结构-循环链表

循环链表


  1. 将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)
  2. 同样,front=MaxLen-1时,再删除一个元素,也让front=0;
    形成逻辑上的循环。
    循环顺序队列示意图
  3. 【分析】杨辉三角的规律是:
    第1行1个数字,…,第n行有n个数字;
    每行的第一和最后一个数是1;
    从第3行开始,除了首尾的1,其余的数是上一行对应位置的左、右两个数的和。
    例如,第7行的第3个数15是第6行中的第2和第3两个数5和10的和。
    由这一规律可知,我们可用上一行的数来求出对应位置的下一行的内容。
    为此,可用队列来保存上一行的内容。
    每当由上一行的两个数求出下一行的一个数时,其中的前一个数便需要出队(删除),而新求出的数就要入队(插入)。
  4. 下为代码:
#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]);
                }  
        }  
    }  
} 

猜你喜欢

转载自blog.csdn.net/ajdj26/article/details/53712513