使用链表的多项式计算器

时间:2018-04-12 04:33:12

标签: java linked-list

我正在研究一个多项式计算器项目,我正在研究第一部分。多项式将以特定格式表示,其中两个多项式是表示系数和指数的整数序列。这是一个例子。

4 3 -2 2 6 1
6 3 5 2 3 1

多项式1 = 4x^3 - 2x^2 + 6x且多项式2 = 6x^3 + 5x^2 + 3x 我应该使用Linked List来实现这一点。 这是我的class Node代码:

class Node {
    int coef;
    int power;
    Node next;
    public Node(int coef, int power) {
        this.coef = coef;
        this.power = power;
    }
}

如何有效地分离系数和指数并添加到链接列表? 这是我推送新的多项式节点的代码:

void addPoly(int coef, int pow) {
    Node newNode = new Node(coef, pow);
    if (head == null) {
        head = newNode;
        head.next = null;
    } else {
        Node curr = head;
        while (curr.next != null) {
            curr = curr.next;
        }
        curr.next = newNode;
    }
}

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以拆分输入,然后将每个结果字符串转换为整数。如果功率始终按降序排列,则会向后循环以降低代码复杂性。

String s = "4 3 -2 2 6 1";
int[] values = Arrays.stream(s.split(" "))
    .mapToInt(Integer::valueOf)
    .toArray();
assert values.length % 2 == 0;
for (int i = values.length - 1; i > 0; i = i - 2) {
    int coeff = values[i - 1];
    int power = values[i];
    addPoly(coeff, power);
}

addPoly可以缩减为

void addPoly(int coeff, int power) {
    Node node = new Node(coeff, power);
    node.next = head;
    head = node;
}

在第一次迭代headnull,因此第一个节点成为列表的末尾。下一步是前一步。所以head就是next。最后但并非最不重要的是,新节点成为下一个head

答案 1 :(得分:0)

Java-9解决方案,使用带有两个捕获组和Pattern的正则表达式MatchResults stream

String input = "4 3 -2 2 6 1";
Pattern p = Pattern.compile("\\s*(-?\\d+)\\s+(-?\\d+)");
// add all the polynomials to myList
p.matcher(input).results().forEach(m -> myList.addPoly(m.group(1), m.group(2));