【重学数据结构】一元多项式的表示及相加
2016-01-21 21:41
411 查看
严蔚敏版数据结构中的例子,不过我没用C语言,而用了C++,因为C++标准模板库中已经有了各种泛型容器,用起来比较方便。
这是第一篇,实现了2.4节:一元多项式的表示及相加,详细代码见http://codepad.org/cV4t8YLq
下面说一下核心算法:
然后根据两个迭代器,可以分三种情况:
一是可以插入
二是可以合并
三是无法做这上述两种情况,需要累加左操作数。
这里面用了三个小函数,
一是用于确定上述三种情况的哪一种的函数cmp,
返回-1,表示可以参数 j “小于” 参数 i,既然“小于”, 就可以把 j 插入 i的前面;
返回0,表示相等,则合并;
返回1,表示大于,则需要累加 i,因为不知道需要累加几次,所以用while循环。又因为累加 i 改变了 i 的值,所以这种情况要放在最上面。
因为还要考虑到 i 指向 this->end(), 所以做成一个函数比较好,这种情况作的操作也是插入,所以也返回 -1
然后是用于插入的小函数
从std::list继承而来的insert方法返回的是插入了的元素的位置,而我需要指向的是即插入前原本指向的元素,所以要累加一起。
最后是用于合并的小函数
这是第一篇,实现了2.4节:一元多项式的表示及相加,详细代码见http://codepad.org/cV4t8YLq
下面说一下核心算法:
Polynomial &Polynomial::operator+=(Polynomial right) { for (Polynomial::iterator i = this->begin(), j = right.begin(); j != right.end(); ++j) { while (this->cmp(j, i) == 1) ++i; if (this->cmp(j, i) == -1) { this->MyInsert(i, *j); } else { this->MyMerge(i, j->k); } } return *this; }即加法功能,把右操作数的加到左操作数,所以先是一个for循环遍历右操作数,
然后根据两个迭代器,可以分三种情况:
一是可以插入
二是可以合并
三是无法做这上述两种情况,需要累加左操作数。
这里面用了三个小函数,
一是用于确定上述三种情况的哪一种的函数cmp,
int Polynomial::cmp(Polynomial::iterator j, Polynomial::iterator i) // > 1, == 0, < -1 { if (i == this->end()) { return -1; } else { if (j->e < i->e) return -1; else if (j->e == i->e) return 0; else return 1; } }
返回-1,表示可以参数 j “小于” 参数 i,既然“小于”, 就可以把 j 插入 i的前面;
返回0,表示相等,则合并;
返回1,表示大于,则需要累加 i,因为不知道需要累加几次,所以用while循环。又因为累加 i 改变了 i 的值,所以这种情况要放在最上面。
因为还要考虑到 i 指向 this->end(), 所以做成一个函数比较好,这种情况作的操作也是插入,所以也返回 -1
然后是用于插入的小函数
void Polynomial::MyInsert(Polynomial::iterator &i, Polynomial::value_type const &v) { i = this->insert(i, v); ++i; }
从std::list继承而来的insert方法返回的是插入了的元素的位置,而我需要指向的是即插入前原本指向的元素,所以要累加一起。
最后是用于合并的小函数
void Polynomial::MyMerge(Polynomial::iterator &i, int k) { i->k += k; if (i->k == 0) { i = this->erase(i); } else { ++i; } }这最简单了,用不着解释。之所以做成一个函数,除了优化结构外,还起到注释的作用,因为需要取一个名字。
相关文章推荐
- 数据结构及算法——单链表逆转(C语言)(不间断更新)
- 数据结构之链表基本操作
- Java核心技术笔记——数据结构(3)
- 刨根问底-Redis数据结构剖析
- opencv数据结构-MAT结构详解
- 【数据结构】二叉树
- 数据结构_8:排序:C语言
- 数据结构_8:查找:Hash:C++
- 数据结构_8:查找:Hash:C语言
- 数据结构_8:查找:C++
- 数据结构_8:查找:平衡二叉树
- 数据结构_8:查找:二叉排序树
- 再谈单链表
- MySQL索引背后的数据结构及算法原理
- 数据结构算法经典合集
- 算法与数据结构
- 数据结构(3)归并排序
- pyhton 数据结构二
- 数据结构 线性表―单链表
- Java核心技术笔记——数据结构(2)