题目
背景:
编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。
说明:
多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。
单项式指数字与字母幂的乘积构成的代数式。对一元多项式,字母只有一种。
同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式。按指数降序指多项式中,单项式按指数从大到小顺序相连。
格式说明
一元多项式输入输出时以字符串形式表示,格式如下
单项式之间用单个加减运算符相连,运算符:+,-
单项式由系数、字母、指数标识符、指数依次直接相连组成,各部分均不能省略。
系数:只由若干0到9数字字符组成(系数不等于0,且不以0开头)
字母:X
指数标识符:^
指数:只由若干0到9数字字符组成(指数可等于0,不等于0时不以0开头)
其他约定
输入不为空串,输出若为0则以空串表示
字符串中除以上字符,不包含空格等其他字符,字符串尾部以’\0’结束
多项式中第一个单项式前加运算时省略+符号,减运算时有-符号
注意:输入多项式符合上述格式,无需检查;输出多项式格式由考生程序保证
规格
输入多项式满足如下规格,考生程序无需检查:
–0<单项式系数<=1000<>
–0<=单项式指数<=3000<>
–单项式个数不限制,但同类项合并处理后,单项式的系数小于65535。
示例
例一
输入:
“7X^4-5X^6+3X^3”
输出:
“-5X^6+7X^4+3X^3”
例二
输入:
“-7X^4+5X^6-3X^3+3X^3+1X^0”
输出:
“5X^6-7X^4+1X^0”
解析
该题目有几个难点:
1、输入的字符串如何进行分解得到单项表达式,怎么从单项表达式里面提取系数和指数?
2、每个单项表达式怎么表示?
3、具体算法怎么完成?要求单项式按指数从大到小顺序相连怎么实现?
整体思路
首先说一下我的思路:我是利用单链表的思想解决这个问题,每个单项表达式存为一个节点,先利用正则表达式将该字符串进行分解,得到一个以单项表达式为节点的链表,然后一次遍历链表里面的节点进行计算,新建一个有序的存放计算结果的链表,将计算得到的结果有序的插入,最后利用Stringbuffer将链表里面的信息转换为字符串
具体实现
1、单项表达式节点的表示
/**
* 单项表达式节点
*
*/
class Expression {
char calc;//每个单项表达式前面的符号,可以是+,-
int index;// 指数
int ratio;// 系数
boolean counted = false;// 该项是否已经计算过,默认情况下是没有计算过
Expression next;//链接链表的指针
}
counted用来表示该单项表达式是否已经计算过,如果已经计算过遍历到的时候也直接跳过,不再进行计算。
2、将字符串转换为链表
代码注释的很详细,如果正则表达式看不懂的自己百度一下
private static Expression GetExpression(