问题描述
大家好,所以我必须弄清楚如何在多项式构造函数中如何将(String s)放入双链表中?创建一个术语。 然后将表达式分解成各个部分,并为每个部分创建术语。 需要对它们进行组合和重新排序以将它们转换为规范形式并存储在DList中。 解析必须在之后完成。我们需要使用双重链表实现来规范化或操纵输入字符串,然后将其存储在链表中。
public class Polynomial extends AbstractPolynomial {
public Polynomial(String s) { // complete this code
This I will have to parse eventually and bring create a node
/* This is what I've done so far so I'm trying to go through String and look for the - + and then get the index? */
int [] coef;
int degree;
int d = -1;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)=='-') {
}
if(s.charAt(i)== '+'){
}
//All the way to here
}
}
public Polynomial() { //we don't touch or modify
super();
}
public AbstractPolynomial add(AbstractPolynomial p){
AbstractPolynomial ans = new Polynomial();
// complete this code
return ans;
}
public AbstractPolynomial subtract(AbstractPolynomial p) {
AbstractPolynomial ans = new Polynomial();
// complete this code
return ans;
}
public AbstractPolynomial multiply(AbstractPolynomial p) { //we have to multiply
AbstractPolynomial ans = new Polynomial();
// complete this code
return ans;
}
/****************
* MAIN FUNCTION
****************/
public static void main(String args[]) throws Exception {//we don't touch or modify
//Variables
Scanner scnr = new Scanner(System.in);
AbstractPolynomial p,q;
String testInput = "";
//Custom test case
if(scnr.hasNext()){
testInput = scnr.nextLine();
p = new Polynomial(testInput);
testInput = scnr.nextLine();
q = new Polynomial(testInput);
System.out.println("User Input\n***************************");
Utility.run(p,q);
}
//Default test case
else{
p = new Polynomial(" X^5");
q = new Polynomial("X^2 - X + 1");
System.out.println("Default Input\n***************************");
Utility.run(p,q);
}
}
}
class Term { // we don't touch or modify
Double coefficient;
int degree;
public Term() {
this(null,0);
}
public boolean isPositive() {
return coefficient > 0;
}
public Term(Double coefficient,int degree) {//we don't touch or modify
this.coefficient = coefficient;
this.degree = degree;
}
public Double getCoefficient() {//we don't touch or modify
return coefficient;
}
public void setCoefficient(Double coefficient) {//we don't touch or modify
this.coefficient = coefficient;
}
public int getDegree() {//we don't touch or modify
return degree;
}
public void setDegree(int degree) {//we don't touch or modify
this.degree = degree;
}
public String toString() {//we don't touch or modify
String ans = "";
if (coefficient.doubleValue() == 0) return "";
if (degree == 0) return coefficient.toString();
if (coefficient != 1) {
if (coefficient == -1) ans += "-";
else ans += coefficient + " ";
}
ans = ans + "X";
if (degree == 1) return ans;
return ans + "^" + degree;
}
}
class DList<T> {//we don't touch or modify
private DNode<T> header,trailer;
private int size;
public DList() {
size = 0;
header = new DNode<T>(null,null,null);
trailer = new DNode<T>(null,header,null);
header.setNext(trailer);
}
// utility methods
public int size() {//we don't touch or modify
return size;
}
public boolean isEmpty() {//we don't touch or modify
return size == 0;
}
// give clients access to nodes,but not to the header or trailer
public DNode<T> getFirst() throws Exception {//we don't touch or modify
if (isEmpty())
throw new Exception("Empty");
return header.getNext();
}
public DNode<T> getLast() throws Exception {//we don't touch or modify
if (isEmpty())
throw new Exception("Empty");
return trailer.getPrev();
}
public DNode<T> getNext(DNode<T> v) throws Exception {//we don't touch or modify
DNode<T> ans = v.getNext();
if (ans == null || ans == trailer)
throw new Exception("No such node");
return ans;
}
public DNode<T> getPrev(DNode<T> v) throws Exception {//we don't touch or modify
DNode<T> ans = v.getPrev();
if (ans == null || ans == header)
throw new Exception("No such node");
return ans;
}
// methods to change the list
public void addBefore(T d,DNode<T> v) {//we don't touch or modify
DNode<T> u = v.getPrev();
DNode<T> x = new DNode<T>(d,u,v);
u.setNext(x);
v.setPrev(x);
size++;
}
public void addAfter(T d,DNode<T> v) {//we don't touch or modify
DNode<T> w = v.getNext();
DNode<T> x = new DNode<T>(d,v,w);
v.setNext(x);
w.setPrev(x);
size++;
}
public void addFirst(T d) {//we don't touch or modify
addAfter(d,header);
}
public void addLast(T d) {//we don't touch or modify
addBefore(d,trailer);
}
public T remove(DNode<T> v) throws Exception {//we don't touch or modify
if (v == header || v == trailer)
throw new Exception("Sentinel");
DNode<T> u = v.getPrev();
DNode<T> w = v.getNext();
w.setPrev(u);
u.setNext(w);
size--;
return v.getData();
}
// LinkedList testing methods:
public String toString() {//we don't touch or modify
String ans = "";
DNode<T> n = header;
ans += "(H)<-->";
do {
n = n.getNext();
if (n == trailer)
ans += "(T)";
else
ans += (n.getData() + "<-->");
} while (n != trailer);
return ans;
}
}
abstract class AbstractPolynomial { //we don't touch or modify
DList<Term> data = null;
public AbstractPolynomial() {
data = new DList<>();
}
public final String toString() {
String ans = "";
boolean starting = true;
try {
DNode<Term> n = data.getFirst();
while (n != null) {
if (!starting && n.getData().isPositive()) ans += " +";
starting = false;
ans += " " + n.getData().toString();
n = data.getNext(n);
}
} catch (Exception e) {
if (starting) return "0";
}
return ans;
}
abstract public AbstractPolynomial add(AbstractPolynomial p);
abstract public AbstractPolynomial subtract(AbstractPolynomial p);
abstract public AbstractPolynomial multiply(AbstractPolynomial p);
}
class Utility {// we don't touch or modify
public static void run(AbstractPolynomial p,AbstractPolynomial q) throws Exception {//dont touch or modify
System.out.println("Polynomials\np = " + p + "\nq = " + q);
System.out.println("Sum " + p.add(q));
System.out.println("Difference " + p.subtract(q));
System.out.println("Product " + p.multiply(q));
}
}
class DNode<T> { //we don't touch or modify
private T data;
private DNode<T> prev,next;
public DNode(T d,DNode<T> p,DNode<T> n) {
data = d;
next = n;
prev = p;
}
public T getData() {
return data;
}
public DNode<T> getNext() {
return next;
}
}
解决方法
如果需要将输入作为字符串并将其分开,则应尝试在String类中使用split()方法。
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)