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
- C++栈学习——赋值运算法的重载
- C++:赋值运算符重载
- 学习C++——运算符重载
- 经典面试题——赋值运算符的重载
- 赋值运算符的重载
- 重载赋值运算符(c/c++)
- 运算符重载——重载赋值运算符=用于字符串赋值
- 重载赋值运算符(c++)
- 剑指offer学习-赋值运算符重载
- 【C++】学习笔记五十一——运算符重载
- 运算符重载--类的赋值运算符重载
- 运算符重载-赋值运算符的重载
- 《剑指offer》——重载赋值运算符函数
- C++语言— 类中的赋值运算符重载
- 赋值运算符重载函数[C/C++/C#]
- 赋值运算符的重载函数
- 重载赋值运算符怎么使用的
- 33.C++赋值运算符的重载
- 开始录制&&遇到的问题
- javascript事件处理的三种方式
- 写需求分析时
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- Mac上设置 使用终端打开sublime text
- C++栈学习——赋值运算法的重载
- Spring 3 MVC hello world example – Annotation
- 在kettle中使用js控件生成mysql库中的uuid
- 集电极开路、漏极开路、上拉电阻、下拉电阻等接口相关基本概念
- struct file_operations 和 struct inode 详解
- 《AndroidStudio每日一贴》7. 如何将本地变更文件移到其它的changelist?
- [数学]hdu5358
- Ubuntu 14.04使用Prime切换双显卡
- google支付简略流程