多项式加法的Java实现

使用了单向链表实现多项式加法。偷了个懒,用了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();
	}
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值