链表一元多项式计算器的实现(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());
}else
s.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 stub
while(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语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 数据结构(java语言描述)
概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...
- 数据结构(Java语言描述)-第一章:概述
第一章 概述 1.0 序言 自己为啥要学数据结构嘞,我觉得主要有以下三个原因: 前段时间在看并发编程时,发现aqs,corrunthashmap等底层都用到了数据结构,主要的有队列,还有链表,学习数据 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 【数据结构】之二叉树(Java语言描述)
有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...
- 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 数据结构--Java语言描述
本篇文章是为了记录自己在学习数据结构时的笔记,会对常见的数据结构做基本的介绍以及使用Java语言进行实现.包括 动态数组 栈 队列 链表 二分搜索树 优先队列和堆 线段树 Trie树 并查集 AVL树 ...
- 【数据结构】之队列(Java语言描述)
在[这篇文章]中,我简单介绍了队列的基本数据结构及操作方式,并用C语言代码描述了队列的基本功能实现. JDK中默认为我们提供了队列的API—— Queue . Queue是一个接口,其中提供了处理队列 ...
随机推荐
- 在Eclipse中设置进行JNI的头文件编译方法(转 http://blog.csdn.net/mirkerson/article/details/17187109)
这两天在搞NDK开发,JNI的头文件进行编译的时候,要跑到对应的class文件路径下(通常是工程的bin目录),进行编译生成,很是不便,也容易出错,所以考虑在Eclipse中作为外部工具引入,所以便查 ...
- C# 根据第几周和季度 获取开始时间和结束时间
/// <summary> /// 根据第几周 获取开始时间和结束时间 /// </summary> /// <param name="week"&g ...
- html固定宽度下拉框内容显示不全问题解决方法
不少时候在页面中为了布局的需要,下拉列表<select>的宽度需要设成比较小的值,这时如果恰巧它包含的选择项<option>的内容比较长,那么超出select宽度的部分将会被截 ...
- 逻辑卷管理LVM 扩容LV容量实例(一)
实验环境: 一台Linux 服务器添加两块硬盘,一块硬盘容量30G,另一块硬盘容量50G,采用VMware Workstation虚拟机进行模拟实验. 30G硬盘先分成一个分区,分区大小为25G,再创 ...
- fork 至 “sys_clone" SyS_clone
注:glibc-2.17中fork的相应系统调用是sys_clone及SyS_clone.有人说调用的是sys_fork,但是我持否定意见,如果我们向真的来发起系统调用可以使用syscall. for ...
- java学习之maven
maven是项目构建工具,能把项目抽象成POM(Project Object Model) Maven使用POM对项目进行构建.打包.文档化等操作 解决了项目需要类库的依赖管理,简化了项目开发环境搭建 ...
- SmbException: 0xC000007F
The error code 0xC000007F means: NT_STATUS_DISK_FULL There is not enough space on the disk. https: ...
- VCard介绍
91助手和豌豆荚用VCard来存储通讯录,今天调查了一下. 1. 方案 使用VCard存储通讯录,文件扩展名为 vcf, 数据文件可以直接导入IPhone/Windows Phone/android ...
- mysql触发器应用和创建表错误代码: 1118 Row size too large. 解决
1.针对数据库查询问题的方便,可以建立重要表的log备份记录表,在主表的添加,修改,删除添加触发器,修改触发器增加触发字段的点,限制条件. 数据库log表查问题比从线上多台服务器上下载日志文件相对方便 ...
- 更好的使用JAVA线程池
这篇文章分别从线程池大小参数的设置.工作线程的创建.空闲线程的回收.阻塞队列的使用.任务拒绝策略.线程池Hook等方面来了解线程池的使用,其中涉及到一些细节包括不同参数.不同队列.不同拒绝策略的选择. ...