链表一元多项式计算器的实现(Java语言描述)
链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进。
代码如下:
package 一元多项式计算器;public class PolyNode {private double a; private int i; PolyNode next; public PolyNode(double a,int i){ this.a=a; this.i=i; this.next=null; } public PolyNode(){ this(0,0); } public double getA() { return a; } public int getI() { return i; } public void setA(double a) { this.a = a; } public void setI(int i) { this.i = i; } }
package 一元多项式计算器;public class PolyList {PolyNode head; PolyNode current; public PolyList(){ head=new PolyNode(); current=head; head.next=null; } //是否为空 public boolean isEmpty(){ return head.next==null; } //这里只考虑按顺序插入元素 public void insert(PolyNode node){ current.next=node; current=node; } //打印多项式 public String printS(){ StringBuilder s=new StringBuilder(""); StringBuilder a=new StringBuilder(""); StringBuilder i=new StringBuilder(""); StringBuilder theOne=new StringBuilder("");current=head.next;int count1=0;int count2=0;while(current!=null){if(current.getA() == 0){count1++;}count2++;current = current.next;}if(count1 == count2){s.append("0");}else{current=head.next; while(current!=null){ a.delete(0, a.length()); i.delete(0, i.length()); theOne.delete(0, theOne.length()); if((current.getA()==1 || current.getA()==-1) && current.getI()!=0) a.append(""); else if(current.getA() < 0){a.append(String.valueOf((-current.getA())));}else{a.append(String.valueOf(current.getA())); }if(current.getI()==1) { i.append(""); theOne.append(a.toString()).append("x").append(i.toString()); } else if(current.getI()==0){ i.append(""); theOne.append(a.toString()); } else{i.append(String.valueOf(current.getI())); theOne.append(a.toString()).append("x^").append(i.toString()); }if(current.getA() == 0){s.append("");}else{if(current==head.next && current.getA()<0){s.append("-").append(theOne.toString());}else if(current==head.next && current.getA()>0){s.append(theOne.toString());}else if(current.getA() < 0){s.append(" - ").append(theOne.toString());}elses.append(" + ").append(theOne.toString()); }current = current.next; }}return s.toString(); } //加法运算 public static PolyList add(PolyList p1,PolyList p2){ PolyList result=new PolyList(); //分别指向p1 p2的第一个元素 p1.current=p1.head.next; p2.current=p2.head.next; while(p1.current!=null && p2.current!=null){ if(p1.current.getI()==p2.current.getI()){ result.insert(new PolyNode(p1.current.getA()+p2.current.getA(),p1.current.getI())); p1.current=p1.current.next; p2.current=p2.current.next; } else if(p1.current.getI()<p2.current.getI()){ result.insert(p1.current); p1.current=p1.current.next; }else{ result.insert(p2.current); p2.current=p2.current.next; } } while(p1.current!=null){ result.insert(p1.current); p1.current=p1.current.next; } while(p2.current!=null){ result.insert(p2.current); p2.current=p2.current.next; } //return result; result.current=result.head.next; PolyNode tempPrevious=result.current; PolyNode temp=result.current.next; while(result.current.next!=null){ while(temp!=null) { if(temp.getI()!=result.current.getI()) { temp=temp.next; tempPrevious=tempPrevious.next; }else{ result.current.setA(result.current.getA()+temp.getA()); tempPrevious.next=temp.next; temp=temp.next; } } result.current=result.current.next; tempPrevious=result.current; temp=result.current.next; } return result; } //减法运算public static PolyList sub(PolyList p1,PolyList p2){ PolyList result=new PolyList();p2.current = p2.head.next;while(p2.current!=null){p2.current.setA(-(p2.current.getA()));p2.current=p2.current.next;}//System.out.println(p2.printS());//分别指向p1 p2的第一个元素 p1.current=p1.head.next; p2.current=p2.head.next; while(p1.current!=null && p2.current!=null){ if(p1.current.getI()==p2.current.getI()){ result.insert(new PolyNode(p1.current.getA()+p2.current.getA(),p1.current.getI())); p1.current=p1.current.next; p2.current=p2.current.next; } else if(p1.current.getI()<p2.current.getI()){ result.insert(p1.current); p1.current=p1.current.next; }else{ result.insert(p2.current); p2.current=p2.current.next; } } while(p1.current!=null){ result.insert(p1.current); p1.current=p1.current.next; } while(p2.current!=null){ result.insert(p2.current); p2.current=p2.current.next; } return result; } //乘法运算 public static PolyList multiply(PolyList p1,PolyList p2){ PolyList result=new PolyList(); //分别指向p1 p2的第一个元素 p1.current=p1.head.next; p2.current=p2.head.next; while(p1.current!=null){ while(p2.current!=null) { double a=p1.current.getA()*p2.current.getA(); int i=p1.current.getI()+p2.current.getI(); result.insert(new PolyNode(a,i)); p2.current=p2.current.next; } p1.current=p1.current.next; p2.current=p2.head.next; } //合并同类项 result.current=result.head.next; PolyNode tempPrevious=result.current; PolyNode temp=result.current.next;PolyNode t = result.current.next;while(result.current.next!=null){ while(temp!=null) { if(temp.getI()!=result.current.getI()) { temp=temp.next; tempPrevious=tempPrevious.next; }else{ result.current.setA(result.current.getA()+temp.getA()); tempPrevious.next=temp.next; temp=temp.next; } } result.current=result.current.next; tempPrevious=result.current; temp=result.current.next; } return result; } //就地逆置单链表public static void reverse(PolyList p_){PolyNode p,q;p = p_.head.next;p_.head.next = null;while(p!=null){q = p.next;p.next = p_.head.next;//让p.next变成p_.head.next;p_.head.next = p;//让p_.head.next变成p;p = q;//让p变成q;}}
}
package 一元多项式计算器;
import java.util.*;public class Testclass {public static void main(String[] args) {// TODO Auto-generated method stubwhile(true){PolyList p1 = new PolyList();PolyList p2 = new PolyList();Scanner scan = new Scanner(System.in);System.out.print("请输入要计算的第一个多项式的系数和指数,以0,0结束:");double a = scan.nextDouble();int i = scan.nextInt();while(a!=0 || i!=0){p1.insert(new PolyNode(a,i));a = scan.nextDouble();i = scan.nextInt();}System.out.println("您输入的第一个多项式为:");System.out.println("p1 = " + p1.printS());System.out.print("请输入要计算的第二个多项式的系数和指数,以0,0结束:");a = scan.nextDouble();i = scan.nextInt();while(a!=0 || i!=0){p2.insert(new PolyNode(a,i));a = scan.nextDouble();i = scan.nextInt();}System.out.println("您输入的第二个多项式为:");System.out.println("p2 = " + p2.printS());System.out.println("请按提示选择您想要进行的运算:");System.out.println("0 -----> +");System.out.println("1 -----> -");System.out.println("2 -----> x");int n;n = scan.nextInt();if(n == 0){PolyList resultList= PolyList.add(p1, p2);PolyList.reverse(resultList);System.out.println("p1 + p2 = "+resultList.printS()); }else if(n == 1){PolyList resultList= PolyList.sub(p1, p2); PolyList.reverse(resultList);System.out.println("p1 - p2 = "+resultList.printS()); }else{PolyList resultList= PolyList.multiply(p1, p2); //PolyList.reverse(resultList);System.out.println("p1 x p2 = "+resultList.printS()); }}}
}
//还存在的bug:1-当系数为0的时候应该删去一整项; 已解决!
// 2-当一个多项式只有0时,应该输出一个0;已解决!
// 3-计算器的仿真界面。已解决!使用不方便!
// 4-合并同类项有空指针错误,待解决,错误数据如1 1 1 1 0 0+1 1 1 1 0 0;
链表一元多项式计算器的实现(Java语言描述)相关推荐
- java链表的用法_数据结构(java语言描述)链表的使用
1.定义node类,实现Node结点的构造函数(空结点和指定数值的结点),基本的获取结点的指针域,数据域,设置指针域,数据域. package class2; public class Node { ...
- 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)
题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...
- 杀人游戏约瑟夫环(洛谷P1145题题解,Java语言描述)
题目要求 题目链接P1145 约瑟夫环问题了解一下 约瑟夫环问题其实在数据结构里与单循环链表关系密切,但是这里模拟就完事~~ 我写过的约瑟夫环问题 AC代码(Java语言描述) import java ...
- HashMap暴力枚举(洛谷P1765题题解,Java语言描述)
前言 本题水题一个,但是这里会结合着提一些HashMap的内容~~但不是什么深度分析,没营养的... 题目要求 P1765题目链接 分析 这题懒得去排着弄,突然就觉得不如打个表,这样还是很简洁滴~~ ...
- 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...
商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...
- s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...
<数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...
- 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客
java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...
- 《数据结构与抽象:Java语言描述(原书第4版)》一JI2.3 抛出异常
本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. H ...
- 《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组
本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...
最新文章
- 年终总结:2021年五大人工智能(AI)和机器学习(ML)发展趋势
- 获取顺序容器vector,deque,string和array的首尾元素的方法有四个
- 生成验证码图片的Java代码
- ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
- 问题 G: 区间权值
- 回到顶部 jquery
- NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)
- 【NLP Subword】三大算法原理:BPE、WordPiece、ULM
- linux夸分区建立软链接,Linux硬链接和软链接
- [iOS] 使用xib做为应用程序入口 with Code
- C++函数参数省略号
- 聚焦存储即平台,浪潮存储迎来发展新机遇
- toms 尺寸 shoes or boots finds
- 2018-07-03 根据Excel后缀名获取WorkBook
- windows有哪些版本
- Android自定义View(一)
- Notes on MatConvNet(II):vl_simplenn
- 带中文的网页下载为PDF格式的文件(jsPDF)
- 解决《新编全医药学大词典》开机启动及桌面快捷方式的问题
- 亚马逊智能化管理软件解孵全面便捷的仓库管理功能