
Java 高级程序设计:作业 09
Java 高级程序设计:实验九 实现线性表、栈、队列和优先队列
代码地址:Github
实验目的和要求
- 初步熟悉线性表、栈、队列和优先队列的设计原理,能设计出实现这些功能的初步类;
- 掌握利用线性表、栈、队列和优先队列设计测试用例;
实验内容
- (在MyList中实现操作)在MyList接口中省略了方法addAll、removeAll、retainAll、toArray()和toArray(T[])的实现,请实现它们。
- (在MyLinkedList中实现操作)在MyLinkedList接口中省略了如下方法的实现,请实现它们。
- (素数迭代器)定义一个名为PrimeIterator的迭代器类,用于遍历素数。构造方法带参数,用于指定素数的上限,比如,new PrimeIterator(20000)创建一个迭代器,可以用于遍历小于等于20000的素数。编写一个测试程序,使用该迭代器现实所有小于或者等于8000的素数。
实验结果
Answer01
MyList.java
public interface MyList<E> extends Iterable<E> {
void add(E e);
void add(int index, E e);
Object[] toArray();
<T> T[] toArray(T[] a);
void clear();
boolean contains(E e);
E get(int index);
int indexOf(E e);
boolean isEmpty();
int lastIndexOf(E e);
boolean remove(E e);
E remove(int index);
Object set(int index, E e);
int size();
boolean addAll(MyList<E> otherList);
boolean removeAll(MyList<E> otherList);
boolean retainAll(MyList<E> otherList);
}
MyAbstractList.java
public abstract class MyAbstractList<E> implements MyList<E> {
protected int size = 0;
protected MyAbstractList() {
}
protected MyAbstractList(E[] objects) {
for (E object : objects) {
add(object);
}
}
@Override
public void add(E e) {
add(size, e);
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public int size() {
return size;
}
@Override
public boolean remove(E e) {
if (indexOf(e) >= 0) {
remove(indexOf(e));
return true;
} else {
return false;
}
}
@Override
public boolean retainAll(MyList<E> otherList) {
int lastSize = size;
this.forEach(item -> {
if (!otherList.contains(item)) {
remove(item);
}
});
return lastSize != size;
}
@Override
public boolean removeAll(MyList<E> otherList) {
int lastSize = size;
otherList.forEach(this::remove);
return lastSize != size;
}
@Override
public boolean addAll(MyList<E> otherList) {
int lastSize = size;
otherList.forEach(this::add);
return lastSize != size;
}
}
Answer02
MyLinkedList.java
public class MyLinkedList<E> extends MyAbstractList<E> {
private Node<E> head, tail;
public MyLinkedList() {}
public MyLinkedList(E[] objects) {
super(objects);
}
public E getFirst() {
if (size == 0) {
return null;
} else {
return head.element;
}
}
public E getLast() {
if (size == 0) {
return null;
} else {
return tail.element;
}
}
public void addFirst(E e) {
Node<E> newNode = new Node<>(e); // Create a new node
newNode.next = head; // link the new node with the head
head = newNode; // head points to the new node
size++; // Increase list size
if (tail == null) // the new node is the only node in list
{
tail = head;
}
}
public void addLast(E e) {
Node<E> newNode = new Node<>(e); // Create a new for element e
if (tail == null) {
head = tail = newNode; // The new node is the only node in list
} else {
tail.next = newNode; // Link the new with the last node
tail = tail.next; // tail now points to the last node
}
size++; // Increase size
}
@Override
public void add(int index, E e) {
if (index == 0) {
addFirst(e);
} else if (index >= size) {
addLast(e);
} else {
Node<E> current = head;
for (int i = 1; i < index; i++) {
current = current.next;
}
Node<E> temp = current.next;
current.next = new Node<>(e);
(current.next).next = temp;
size++;
}
}
@Override
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for (Node<E> x = head; x != null; x = x.next) {
result[i++] = x.element;
}
return result;
}
@Override
public <T> T[] toArray(T[] a) {
if (a.length < size) {
a = (T[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
}
int i = 0;
Object[] result = a;
for (Node<E> x = head; x != null; x = x.next) {
result[i++] = x.element;
}
if (a.length > size) {
a[size] = null;
}
return a;
}
public E removeFirst() {
if (size == 0) {
return null;
} else {
Node<E> temp = head;
head = head.next;
size--;
if (head == null) {
tail = null;
}
return temp.element;
}
}
public E removeLast() {
if (size == 0) {
return null;
} else if (size == 1) {
Node<E> temp = head;
head = tail = null;
size = 0;
return temp.element;
} else {
Node<E> current = head;
for (int i = 0; i < size - 2; i++) {
current = current.next;
}
Node<E> temp = tail;
tail = current;
tail.next = null;
size--;
return temp.element;
}
}
@Override
public E remove(int index) {
if (index < 0 || index >= size) {
return null;
} else if (index == 0) {
return removeFirst();
} else if (index == size - 1) {
return removeLast();
} else {
Node<E> previous = head;
for (int i = 1; i < index; i++) {
previous = previous.next;
}
Node<E> current = previous.next;
previous.next = current.next;
size--;
return current.element;
}
}
@Override
public String toString() {
StringBuilder result = new StringBuilder("[");
Node<E> current = head;
for (int i = 0; i < size; i++) {
assert current != null;
result.append(current.element);
current = current.next;
if (current != null) {
result.append(", ");
} else {
result.append("]");
}
}
return result.toString();
}
@Override
public void clear() {
size = 0;
head = tail = null;
}
@Override
public boolean contains(E e) {
Node<E> current = head;
for (int i = 0; i < size; i++) {
if (current.element.equals(e)) {
return true;
}
current = current.next;
}
return false;
}
@Override
public E get(int index) {
checkIndex(index);
Node<E> current = head;
for (int i = 0; i < size; i++) {
if (i == index) {
return current.element;
}
current = current.next;
}
return null;
}
@Override
public int indexOf(E e) {
Node<E> current = head;
for (int i = 0; i < size; i++) {
if (current.element.equals(e)) {
return i;
}
current = current.next;
}
return -1;
}
@Override
public int lastIndexOf(E e) {
Node<E> current = head;
int lastIndex = -1;
for (int i = 0; i < size; i++) {
if (current.element.equals(e)) {
lastIndex = i;
}
current = current.next;
}
return lastIndex;
}
@Override
public E set(int index, E e) {
checkIndex(index);
Node<E> current = head;
E oldValue = null;
for (int i = 0; i < size; i++) {
if (i == index) {
oldValue = current.element;
current.element = e;
break;
}
current = current.next;
}
return oldValue;
}
@Override
public java.util.Iterator<E> iterator() {
return new LinkedListIterator();
}
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException
("Index: " + index + ", Size: " + size);
}
}
private static class Node<E> {
E element;
Node<E> next;
public Node(E element) {
this.element = element;
}
}
private class LinkedListIterator
implements java.util.Iterator<E> {
private Node<E> current = head; // Current index
@Override
public boolean hasNext() {
return (current != null);
}
@Override
public E next() {
E e = current.element;
current = current.next;
return e;
}
@Override
public void remove() {
}
}
}
Answer03
PrimeIterator.java
public class PrimeIterator {
private int maxNumber;
private ArrayList<Integer> primeNumberArray = new ArrayList<>();
public PrimeIterator() {
}
public PrimeIterator(int maxNumber) {
this.maxNumber = maxNumber;
getPrimeNumber();
}
public ArrayList<Integer> getPrimeNumberArray() {
return primeNumberArray;
}
private void getPrimeNumber() {
for (int i = 0; i < maxNumber; i++) {
if (isPrime(i)) {
primeNumberArray.add(i);
}
}
}
private boolean isPrime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return false;
}
return true;
}
}

本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Owen
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果