这个和前缀没关系
普通函数重载二元运算符,参数是2个,成员函数只要1个参数(因为自身代表一个了)
使用AddTerms函数,可以根据需要,从输入流in向一个空多项式添加各项,构成一个多项式(注意,为了简化算法,算法中未包含将用户输入多项式按降幂数据存储的代码) 。
使用Output函数将多项式送输出流,从而输出一个多项式。多项式\[3x^{14}+6x^{2}+2 \]以下列形式输出:3x^14+6x^2+2。
- AddTerms函数从输入流逐个输入多项式的项(系数c和指数e),以输入负指数作为多项式的结束条件。AddTerms函数调用Term类的成员函数InsertAfter(c , e) 构造一个新项结顶,并将其添加到但虚幻链表尾部。初始时,指针q指向空单循环链表的表头结点,新项结顶将插在q指示的结点之后。InsertAfter函数返回新项结点的地址,该地址值被赋给指针q,因此,指针q始终指向尾结点。
- Output函数调用在Term类上重载的 “<<” 运算符。如果高次幂是整系数,则按多项式书写的习惯不打印 “ + ” ;否则,对于非高次幂项,当系数为正时,系数前需另加 “ + ” 号。
template< typename T>
void Polynominal<T>::AddTerms(istream& in) {
Term<T>* q = theList;
T c;
int e;
cout << "输入多项式系数与指数(coef,exp),指数为负数时停止输入\n" << endl;
for (;;) {
cin >> c >> e;
if (e < 0) //如果e为负值,输入完毕
break;
q = q->InsertAfter(c, e);
}
}
template<typename T>
void Polynominal<T>::Output(ostream& out)const {
bool start = true;
Term<T>* p = theList->link;
for (; p != theList; p=p->link) {
if (!start && p->coef > 0)
out << '+';
start = false;
out << *p; //调用Term类上重载的 “<<” 运算符
}
out << endl;
}
//Term类上重载 “<<” 运算符
template <typename T>
ostream& operator<<(ostream& out, const Term<T>& val) {
if (val.coef == 0)
return out;
switch (val.exp) {
case 0:
out << val.coef;
break;
case 1:
if (val.coef != 1)
out << val.coef;
out << "X";
break;
default:
if (val.coef != 1)
out << val.coef;
out << "X^"<<val.exp;
break;
}
return out;
}