C++数组算法小练习

                                                                 数组小练习

      以数组实现的线性表的练习,包括了一些常用算法,C++实现。

#include<iostream>
#include<cstdlib>                        //包涵exit
using namespace std;

//定义一个数组类,包涵三个数据成员
//分别是首地址pBase,长度len,有效
//元素个数cnt

class Array
{
public:
    Array(int a=10):len(a)                //初始化数组(构造函数)
    {                                        
        pBase=new int[a];
        cnt=0;
        if(NULL==pBase)
        {
            cout<<"动态数组申请失败!"<<endl;
            exit(-1);
        }
    }
    Array(const Array& aa);                //拷贝构造函数
    Array& operator=(const Array& aa);    //重载赋值操作符
    friend ostream& operator<<(ostream& out,const Array& aa);//重载输出操作符
    friend Array operator+(const Array& aa,const Array& bb);    //重载加运算符
    bool is_empty()const;                //判断数组是否为空

    bool is_full()const;               //判断数组是否满

    void getlen();                     //获取数组长度
    void getcnt();                       //获取数组有效元素个数
    //void  show()const;                    //输出数组元素
    bool append(int val);                //数组末尾追加元素
    int  get(int pos)const;                //获取数组第pos个元素,无元素时返回-1
    void sort();                        //升序排序
    bool insert(int pos ,int val);        //在数组下标为pos的元素前插入一个val元素
    bool remove(int pos);                //删除下标为pos的元素的前一个元素
    bool clear();                        //清空数组
    void inversion();                    //倒置数组
    bool replace(int pos,int val);        //把下标为pos的前一个元素替换为val
    bool  find(int val)const;    //查找元素val是否在数组中,如果在,输出它为第几个元素,没有的话提示
    bool find(int a,int b,int val)const;   //在区间a,b之间查找
    //bool destroy();                      //销毁数组
    ~Array();
private:
    //Array(const Array& aa);                //拒绝对象之间复制(拷贝构造)
    int *pBase;
    int cnt;
    int len;
};
Array::Array(const Array& aa)                    //拷贝构造函数
{
    pBase=new int[aa.len];
    if(NULL==pBase)
        {
            cout<<"动态数组申请失败!"<<endl;
            exit(-1);
        }
    len=aa.len;
    cnt=aa.cnt;
    if(aa.is_empty());
    else
        for(int i=0;i<aa.cnt;i++)
            pBase[i]=aa.pBase[i];
    //cout<<"拷贝构造函数被调用"<<endl;
}
Array& Array::operator=(const Array& aa)        //重载赋值运算符
{
    //cout<<"赋值操作符被调用。"<<endl;
     if(this==&aa);
    else if(aa.is_empty());
    else
    {
        Array::~Array();
        this->pBase=new int[aa.len];
         if(NULL==pBase)
        {
            cout<<"动态数组申请失败!"<<endl;
            exit(-1);
        }
        len=aa.len;
        cnt=aa.cnt;
    for(int i=0;i<aa.cnt;i++)
           pBase[i]=aa.pBase[i];
    }
    return *this;
}
ostream& operator<<(ostream& out,const Array& aa)        //重载输出运算符
{
    if( aa.is_empty() )
        out<<"数组为空!"<<endl;
    else
    {
        for(int i=0;i<aa.cnt;i++)
            out<<aa.pBase[i]<<" ";
        out<<endl;
    }
    return out;
}
Array operator+(const Array& aa,const Array& bb)    //重载+运算符
{
    int len=aa.len+bb.len;
    Array Arr(len);
    for(int i=0;i<aa.cnt;i++)
        Arr.append(aa.pBase[i]);
    for(int i=0;i<bb.cnt;i++)
        Arr.append(bb.pBase[i]);
    return Arr;

}
bool Array::is_empty( )const //判断数组是否为空
{
    if(cnt==0)
        return true;
    else
        return false;
}
bool Array::is_full( )const //判断数组是否满
{
    if( cnt==len )
        return true;
    else
        return false;

}

void Array::getlen()              //获取数组长度
{
    cout<<"数组长度为:"<<len<<endl;
}
void Array::getcnt()                  //获取数组有效元素个数
{
    cout<<"数组有效元素个数为:"<<cnt<<endl;
}
/*void Array:: show( )const  //输出数组元素
{
    if( is_empty() )
        cout<<"数组为空!"<<endl;
    else
    {
        for(int i=0;i<cnt;i++)
            cout<<pBase[i]<<" ";
        cout<<endl;
    }
}*/
bool Array::append(int val)  //数组末尾追加元素
{
    if( is_full( ) )
    {
        cout<<"数组已满,追加失败"<<endl;
        return false;
    }
    else
    {
        pBase[cnt]=val;
        cnt++;
        return true;
    }
}
bool Array::insert(int pos ,int val)   //在数组下标为pos的元素前插入一个val元素
{
    if(is_full())
    {
    cout<<"数组已满,无法插入!"<<endl;
    return false;
    }
    else
    {
        for(int i=cnt-1;i>=pos-1;i--)
            pBase[i+1]=pBase[i];
        pBase[pos-1]=val;
        cnt++;
        return true;
    }
}
int  Array::get(int pos)const   //获取数组第pos个元素,无元素时返回-1
{
    if( pos<1 || pos>=cnt+1 )
    {
        cout<<"无此元素!"<<endl;
        return -1;
    }
    else
    return pBase[pos-1];
}
bool Array::remove(int pos)   //删除下标为pos的元素的前一个元素
{
    if( is_empty() )
    {
        cout<<"数组为空,无法删除!"<<endl;
        return false;
    }
    else
    {
        for(int i=pos;i<cnt;i++)
            pBase[i-1]=pBase[i];
    cnt--;
    cout<<"删除第"<<pos<<"个元素成功!"<<endl;
    return true;
    }
}
bool Array::clear( )   //清空数组
{
    if( is_empty() )
    {
        cout<<"数组已经为空!"<<endl;
        return true;
    }
    else
    {
        for(int i=0;i<cnt;i++)
            pBase[i]=NULL;
        cnt=0;
        return true;
    }
}
bool Array::replace(int pos,int val)   //把下标为pos的前一个元素替换为val
{
    if(is_empty())
    {
        cout<<"数组为空,无法替换!"<<endl;
    return false;
    }
    else if(pos<1||pos>cnt)
        {
            cout<<"数组中无此元素!"<<endl;
            return false;
    }
    else
        {
        pBase[pos-1]=val;
        return true;
    }

}
void Array::sort()             //升序排序
{
    if( is_empty() )
        cout<<"数组为空,无法排序!"<<endl;
    else
    {
        for(int i=0;i<cnt;i++)
            for(int j=i+1;j<cnt;j++)
            {
                
                if(pBase[i]>pBase[j])
                {
                int t;
                t=pBase[i];
                pBase[i]=pBase[j];
                pBase[j]=t;
                }
            }
    }
}
void Array::inversion()   //倒置数组
{
    if(is_empty())
    cout<<"数组为空,无法倒置!"<<endl;
    else
    {
    int i=0;int j=cnt-1;
    while(i<j)
    {
                int t;    
                t=pBase[i];
                pBase[i]=pBase[j];
                pBase[j]=t;
                i++;
                j--;
    }
    }

}
bool Array:: find(int val)const            //查找数组中是否有val元素
{
    if( is_empty() )
        {
            cout<<"数组为空!不存在此元素!!"<<endl;
            return false;
    }
    else
    {
        int aa=0;
        for(int i=0;i<cnt;i++)
        {
            if( pBase[i]==val )
            {
                cout<<i+1<<"\t";
                aa++;
            }
        }
        if(aa==0)
            cout<<"数组中无此元素"<<endl;
        else
            cout<<endl;
        return true;
    }
}
bool Array::find(int a,int b,int val)const            //在数组第a到第b个元素中查找是否有val元素
{
    if(a>b||a<0||a>=cnt||b>=cnt)
    {
        cout<<"数组为空或者查找范围出错。"<<endl;
        return false;
    }
    else
        {
        int aa=0;
        for(int i=a-1;i<b;i++)
        {
            if( pBase[i]==val )
            {
                cout<<i+1<<"\t";
                aa++;
            }
        }
        if(aa==0)
            cout<<"无此元素"<<endl;
        else
                 cout<<endl;
        return true;
    }
}
Array::~Array()            //析构函数
{
    delete []pBase;
    //cout<<"析构函数被调用。"<<endl;
}
int main()
{
    Array arr;
        cout<<arr;
    arr.append(10);
    arr.append(2);
    arr.append(3333);
    arr.append(44);
    arr.append(55);
    arr.append(6);
    cout<<"追加六个元素后为:"<<endl;
    cout<<arr;
    arr.insert(3,33);
    arr.insert(4,44);
    cout<<"插入后"<<endl;
    cout<<arr;
    cout<<"拷贝后为:"<<endl;
    Array arra(arr);
    cout<<arra;
    arr.sort();
    Array array;
    array=arra;
    cout<<"赋值:"<<endl;
    cout<<array;   
    cout<<"排序后"<<endl;
    cout<<arr;
    cout<<"获取第5个元素为"<<endl;
    cout<<arr.get(5)<<endl;
    arr.remove(3);
    cout<<"删除后为:"<<endl;
    cout<<arr;
    arr.inversion();
    cout<<"倒置后为:"<<endl;
    cout<<arr;
    arr.replace(3,333);
    cout<<"把第三个元素替换为333后为:"<<endl;
    cout<<arr;
    Array Arr;
    Arr=arr+array;
    cout<<"两个数组相加后:"<<endl;
    cout<<Arr;
        cout<<"重新排序后为:"<<endl;
        Arr.sort();
        cout<<Arr;
    cout<<"查找数组中是否有44的元素。"<<endl;
    Arr.find(44);
        cout<<"查找数组中是否有888的元素。"<<endl;
    Arr.find(888);
    cout<<"在数组中第一到第十个元素中查找是否有33的元素。"<<endl;
    Arr.find(1,10,33);
        cout<<"在数组中第一到第十个元素中查找是否有666的元素。"<<endl;
    Arr.find(1,10,666);
    arr.clear();
    cout<<"清空数组后为:"<<endl;
    cout<<arr;
        return 0;
}



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值