使用了单向链表实现多项式加法。偷了个懒,用了java提供的变长数组ArrayList,发现ArrayList真是异常的好用,可以使用这个数据结构简单的实现链表,堆栈,队列等等。本次我使用ArrayList实现单向链表。
程序输入为两个字符串,变量系数为整数,变量系数为1-10的整数,格式如123x3+234x2+1x1。
基本思想就是:
1.使用正则表达式遍历字符串,然后加入到两个链表中。
2.使用两个指针指向链表1、2的头部,逐个向后遍历比较,如果指针指向的指数相等,则加系数,然后将合成新的一项,加入到链表3中。其中要注意系数和为0的情况
3.当链表1、2有一个到头后,看另一个是不是到头了,如果不是,就将剩余部分加到链表3中
package Polynominal;
import java.util.*;
/**
* 系数为整数,指数为0-10的整数
* 思考,有哪些是java为我完成的,C++需要写的
**/
public class polynomial {
public class poly
{
int n;
int a;
}
public ArrayList<poly> p1=new ArrayList();//polynomial 1
public ArrayList<poly> p2=new ArrayList();//初始化成员为class poly的链表
public ArrayList<poly> sum=new ArrayList();//sum
public ArrayList<poly> input(String str)
{
ArrayList<poly> p=new ArrayList();
poly tmp=new poly();//暂存提取出来的系数,稍后存到p中
int len=str.length();
char x;
int i=0;
String sa=new String();
while(i<len)
{
tmp=new poly();
x=str.charAt(i);
sa=new String();//initialize!!!
if(x=='-')
{
i++;
x=str.charAt(i);
while(x<='9'&&x>='0')
{
sa+=x;
i++;
x=str.charAt(i);
}
tmp.a=0-Integer.parseInt(sa);
i++;
x=str.charAt(i);
tmp.n=x-48;
p.add(tmp);
i++;
}
else if(x<='9'&&x>'0')
{
sa=new String();
x=str.charAt(i);
while(x<='9'&&x>='0')
{
sa+=x;
i++;
x=str.charAt(i);
}
tmp.a=Integer.parseInt(sa);
i++;
x=str.charAt(i);
tmp.n=x-48;
p.add(tmp);
i++;
}
else if(x=='+')
{
sa=new String();
i++;
x=str.charAt(i);
while(x<='9'&&x>='0')
{
sa+=x;
i++;
x=str.charAt(i);
}
tmp.a=Integer.parseInt(sa);
i++;
x=str.charAt(i);
tmp.n=x-48;
p.add(tmp);
i++;
}
}
return p;
}
public void excution()
{
Scanner sc=new Scanner(System.in);
String str=sc.next();
p1=input(str);
str=new String();
str=sc.next();
p2=input(str);
int len1=p1.size();
int len2=p2.size();
int i=0,j=0;
poly tmp1=new poly();
poly tmp2=new poly();
poly tmp=new poly();
while(i<len1&&j<len2)
{
tmp1=p1.get(i);
tmp2=p2.get(j);
tmp=new poly();
if(tmp1.n==tmp2.n)
{
int a=tmp1.a+tmp2.a;
if(a==0)
{
i++;
j++;
}
else
{
i++;
j++;
tmp.a=a;
tmp.n=tmp1.n;
sum.add(tmp);
}
}
else if(tmp1.n>tmp2.n)
{
sum.add(tmp1);
i++;
}
else if(tmp2.n>tmp1.n)
{
sum.add(tmp2);
j++;
}
}
if(i<len1)
{
for(;i<len1;i++)
{
sum.add(p1.get(i));
}
}
if(j<len2)
{
for(;j<len2;j++)
{
sum.add(p2.get(j));
}
}
for(int k=0;k<sum.size();k++)
System.out.println(sum.get(k).a+" "+sum.get(k).n);
}
public static void main(String args[])
{
polynomial po=new polynomial();
po.excution();
}
}