既然多项式中的项可以设计为类,那么多项式本身为啥不可以是一个类呢,想想这个多项式类的成员变量不就是一个可容纳项的顺序表吗,将多项式的大部分成员方法分派给这个顺序表来完成,并且将多项式相加的add方法也设计为其一个成员方法,这样在main中就不需要去调用个static的add方法了,请参见以下代码,如果你想通了并且可以实践,那么你的面向对象的思想则大大地进了一步。
多项式类的代码:
package mystudy.datastruct;
/**
* 多项式
* @author lixj
*
*/
public class Polynomial
{
private SeqList list; //多项式是由容纳每一项的集合构成
public Polynomial()
{
list = new SeqList();
}
public Polynomial(int n)
{
list = new SeqList(n);
}
public void addElement(PElem element)
{
list.add(element);
}
public PElem getElement(int index)
{
return (PElem)list.getElement(index);
}
public int getLength()
{
return list.getLength();
}
public String toString()
{
return list.toString();
}
public Polynomial add(Polynomial poly)
{
Polynomial result = new Polynomial();
int pos1 = 1, pos2 = 1;
int len1 = this.getLength();
int len2 = poly.getLength();
//还有用到其他变量,在这里声明这些变量,你意识到要用到这些变量时再来声明
PElem e1, e2, e3;
int exp1, exp2;
while (pos1 <= len1 && pos2 <= len2) {
//e3为要放置在result中的新项,该项目前的系数和幂都是默认值0
e3 = new PElem();
//取出自己中第pos1个元素出来,赋值给e1,取出list2中第pos2个元素出来,赋值给e2
e1 = (PElem) this.getElement(pos1);
e2 = (PElem) poly.getElement(pos2);
//取出e1中的幂,e2中的幂,来作比较
exp1 = e1.getExp();
exp2 = e2.getExp();
//如果e1的幂>e2的幂,则将e1中的系数和幂分别赋值给e3中的系数和幂,且pos1++,即指向后一个位置,并且将e3添加(调用add)到result中
//如果e1的幂<e2的幂,则将e2中的系数和幂分别赋值给e3中的系数和幂,且pos2++,即指向后一个位置,并且将e3添加(调用add)到result中
//如果e1的幂==e2的幂,则将e1中的系数加上e2的系数赋值给e3中的系数,e1的幂赋值给e3的幂,且pos1++,pos2++,即都指向后一个位置,并且将e3添加(调用add)到result中
if (exp1 > exp2) {
e3.setCoefficent(e1.getCoefficent());
e3.setExp(exp1);
pos1++;
} else if (exp1 == exp2) {
e3.setCoefficent(e1.getCoefficent() + e2.getCoefficent());
e3.setExp(exp1);
pos1++;
pos2++;
} else {
e3.setCoefficent(e2.getCoefficent());
e3.setExp(exp2);
pos2++;
}
result.addElement(e3);
}
while (pos1 <= len1) { //意味着自己还没有结束,那么将自己剩余各项的系数和幂赋值到到e3项中,并且将e3添加(调用add)到result中
e3 = new PElem();
e1 = (PElem) this.getElement(pos1);
e3.setCoefficent(e1.getCoefficent());
e3.setExp(e1.getExp());
result.addElement(e3);
pos1++;
}
while (pos2 <= len2) {//意味着list2还没有结束,那么将list2剩余各项的系数和幂赋值到到e3项中,并且将e3添加(调用add)到result中
e3 = new PElem();
e2 = (PElem) poly.getElement(pos2);
e3.setCoefficent(e2.getCoefficent());
e3.setExp(e2.getExp());
result.addElement(e3);
pos2++;
}
return result;
}
}
包含main函数的Client代码:
package mystudy.datastruct;
public class Client {
// 顺序表的应用,求解多项式之和
// 2x6+3x5+5x4+3x3
// 4x5+8x4+2x2+3x+4
public static void main(String[] args) {
Polynomial poly1 = new Polynomial();
PElem e1 = new PElem(2, 6);// 2x6
PElem e2 = new PElem(3, 5);// 3x5
PElem e3 = new PElem(5, 4);// 5x4
PElem e4 = new PElem(3, 3);// 3x3
poly1.addElement(e1);
poly1.addElement(e2);
poly1.addElement(e3);
poly1.addElement(e4);
Polynomial poly2 = new Polynomial();
PElem e21 = new PElem(4, 5);
PElem e22 = new PElem(8, 4);
PElem e23 = new PElem(2, 2);
PElem e24 = new PElem(3, 1);
PElem e25 = new PElem(4, 0);
poly2.addElement(e21);
poly2.addElement(e22);
poly2.addElement(e23);
poly2.addElement(e24);
poly2.addElement(e25);
System.out.println(poly1);
System.out.println(poly2);
Polynomial poly3 = poly1.add(poly2);
System.out.println("相加后的结果为:");
System.out.println(poly3);
}
}