C++栈学习——赋值运算法的重载

来源:互联网 发布:java谷歌地图开发 编辑:程序博客网 时间:2024/06/08 03:09

对于编程,向来都是编的少,看的多,这种错误的学习方法一直延续至今,所以像运算符重载这么简单的东西,还是不太熟,今天借着学习栈的机会,自己写了一下链栈中赋值运算符的重载函数,写完之后对比了一下教材(《数据结构C++语言描述》任燕版),发现自己真是有种简单问题复杂化的天赋——写程序按部就班,不会优化。顺便发现了教材中一个小小的错误,在此加以纠正。

  • 链栈赋值运算符的重载(自己写的重载函数)
    说明一下自己的函数:想要实现不管左值链栈是不是为空,都能将右值链栈整个拷贝过来,所以整体思路就是:首先赋值两个链栈的公共部分的值,接着分为两种情况:(a)左值链栈元素个数小于右值链栈元素个数;(b)左值链栈元素个数大于右值链栈元素个数。
template<typename ElemType>Linkstack <ElemType> Linkstack<ElemType>::operator = (Linkstack <ElemType> rightS){    NodePointer rs,ls,s,r,p;    rs=rightS.top;    ls=top;    r=NULL;    if (this!=&rightS)    {        while (ls!=NULL&&rs!=NULL)//二者公共部分的赋值        {        ls->data=rs->data;        rs=rs->next;        r=ls;        ls=ls->next;        }        //  左值链栈元素个数小于右值链栈元素个数        while (ls==NULL&&rs!=NULL)        {        s=new(LinkNode);        assert(s!=0);        s->data=rs->data;        s->next=NULL;        rs=rs->next;        r->next=s;        r=r->next;        ls=NULL;        }        //  左值链栈元素个数大于右值链栈元素个数        while (ls!=NULL&&rs==NULL)        {            p=ls;            r->next=ls->next;            ls=ls->next;            delete p;        }    }    return *this;}
  • 链栈赋值运算符的重载(《数据结构C++语言描述》任燕版)
    看完作者的程序之后,觉得很汗颜,明明可以先将左值链栈清空,然后按照一种情况来拷贝呢,为啥就是想不到呢?哎,愚蠢之极。作者的代码如下:
template<typename ElemType>Linkstack <ElemType> Linkstack<ElemType>::operator = (Linkstack <ElemType> rightS){    NodePointer p=NULL;    NodePointer rp=rightS.top;    NodePointer s;    if (this!=&rightS)    {        clear();        while (rp)        {            s=new(LinkNode);            assert(s!=0);            s->data=rp->data;            if (!top)            {                top=s;            }            else            {                p->next=s;            }            p=s;            rp=rp->next;        }        if (p)            p->next=NULL;    }    return *this;}
  • 纠正一个错误
    但是,作者的代码中存在一个小小的错误,即没有对指针p进行初始化,修改后程序如下:
template<typename ElemType>Linkstack <ElemType> Linkstack<ElemType>::operator = (Linkstack <ElemType> rightS){    NodePointer p=NULL;    NodePointer rp=rightS.top;    NodePointer s;    if (this!=&rightS)    {        clear();        while (rp)        {            s=new(LinkNode);            assert(s!=0);            s->data=rp->data;            if (!top)            {                top=s;                p=top;/////////////////自己添加的指针初始化部分,否则,指针根本不知道移到哪里去了            }            else            {                p->next=s;            }            p=s;            rp=rp->next;        }        if (p)            p->next=NULL;    }    return *this;}
0 1
原创粉丝点击