①编制多项式加法的类:
例如若p1 = 2x6 + 3x4 + 5x2 + 6,p2 = 2x5 - 3x4 + 5x2 + 8,则p3 = p1 + p2 = 2x6 + 2x5 + 10x2 + 14。
分析传统的做法:
(1)多项式用list容器表示,容器内的每一个元素代表多项式中的每一项。设置多项式p1,p2,并使结果p3结果为空。
(2)利用sort系统函数,使多项式p1,p2中每一项按系数升序排列。
(3)利用iterator技术遍历p1,p2。当p1,p2没有检测完各自的链表时,比较当前结点的指数域。
(4)指数相等,对应项系数相加。若相加结果不为0,则结果加入p3,否则不加入p3。p1,p2各自的iterator迭代指针都进1。
(5)指数不等,小系数者加入p3,相应的迭代器指针进1。
(6)当p1,p2的iterator迭代指针已经有一个检测完毕,把另一个链表的剩余部分加入p3即可,采用函数是系统函数splice。
②上面我们介绍的是传统的做法,接下来介绍的是利用STL的系统函数简便的完成多项式的相加。
(1)利用sort系统函数,使多项式p1,p2中每一项按系数升序排列。
(2)利用merge函数将p1和p2合并,合并后只剩p1。
(3)利用unique函数将p1去掉重复的多项式(需要重载等于号以指数为基准),去除的同时需要将两指数相等的进行相加,具体看代码实现。
(4)然后利用迭代器遍历p1,将每一个多项式push_back到p3中,这就实现了多项式的相加。
③代码实现
头文件AddPolynomial.h
#ifndef ADDPOLYNOMIAL_H_INCLUDED
#define ADDPOLYNOMIAL_H_INCLUDED
#include <iostream>
#include <list>
#include <string>
using namespace std;
class Term
{
private:
int coef;
int exp;
public:
Term(int coef,int exp):coef(coef),exp(exp){}
int GetCoef()
{
return coef;
}
int GetExp()
{
return exp;
}
bool operator<(Term& t)
{
return exp < t.GetExp();
}
bool operator==(Term& t) //重载等于号支持去重
{
if(exp == t.GetExp())
this->coef = coef + t.GetCoef();
else
NULL;
return exp == t.GetExp();
}
};
typedef list<Term> LISTTERM;
ostream &operator<<(ostream& os,Term& t)
{
os << t.GetCoef() << "x" << t.GetExp();
return os;
}
class Polynomial
{
private:
LISTTERM m_stlTermList;
public:
bool AddTerm(const Term& t)
{
m_stlTermList.push_back(t);
return true;
}
Polynomial AddPolynomial(Polynomial& obj)
{
Polynomial result;
m_stlTermList.sort(); //p1排序
obj.m_stlTermList.sort(); //p2排序
m_stlTermList.merge(obj.m_stlTermList); //p1合并p2
m_stlTermList.unique(); //去重
LISTTERM::iterator it = m_stlTermList.begin(); //放入p3中
for(;it != m_stlTermList.end(); it++)
{
result.m_stlTermList.push_back(*it);
}
return result;
}
void Show()
{
LISTTERM::iterator it = m_stlTermList.begin();
while(it != m_stlTermList.end())
{
if((*it).GetCoef() == 0)
{
it++;
continue;
}
cout << *it << "+";
it++;
}
}
};
#endif // ADDPOLYNOMIAL_H_INCLUDED
主函数main.cpp
#include "AddPolynomial.h"
int main()
{
Polynomial p1;
Polynomial p2;
Term t1(2,6);
Term t2(3,4);
Term t3(5,2);
Term t4(6,0);
p1.AddTerm(t1);
p1.AddTerm(t2);
p1.AddTerm(t3);
p1.AddTerm(t4);
Term t5(2,5);
Term t6(-3,4);
Term t7(5,2);
Term t8(8,0);
p2.AddTerm(t5);
p2.AddTerm(t6);
p2.AddTerm(t7);
p2.AddTerm(t8);
cout << "多项式1:";
p1.Show();
cout << "\n多项式2:";
p2.Show();
cout << "\n合并之后的多项式:";
Polynomial p3 = p1.AddPolynomial(p2);
p3.Show();
return 0;
}
这样就是用list容器的函数简便的完成了多项式的相加。