19.1 (修改程序清单19-1) 修改程序清单19-1中的GenericStack类,使用数组而不是ArrayList来实现它。你应该在给栈添加新元素之前检查数组的大小。如果数组满了,就创建一个新数组,该数组是当前数组大小的两倍,然后将当前数组的元素复制到新数组中。
public class GenericStack<E> {
public final static int INITIAL_SIZE = 16;
private E[] elements;
private int size;
//使用默认的初始容量构造一个堆栈
public GenericStack() {
this(INITIAL_SIZE);
}
//构造具有指定初始容量的堆栈
public GenericStack(int initialCapacity) {
elements = (E[])new Object[initialCapacity];
}
//添加一个新的元素到栈顶
public void push(E value) {
if (size >= elements.length) {
E[] temp = (E[])new Object[elements.length * 2];
System.arraycopy(elements, 0, temp, 0, elements.length);
elements = temp;
}
elements[size] = value;
size++;
}
//返回并移除栈顶元素
public E pop() {
return elements[--size];
}
//返回栈顶元素
public E peek() {
return elements[size - 1];
}
//判空
public boolean isEmpty() {
return size == 0;
}
//返回栈中的元素数目
public int getSize() {
return size;
}
}
19.2 (使用继承实现Generic Stack) 程序清单19-1中, GenericStack是使用组合实现的。定义一个新的继承自ArrayList的栈类。画出UML类图, 然后实现GenericStack。编写一个测试程序,提示用户输人5个字符串,然后以逆序显示它们。
import java.util.ArrayList;
import java.util.Scanner;
public class GenericStack2<E> extends ArrayList<E> {
public static void main(String[] args) {
System.out.println("请输入五个字符串: ");
Scanner input = new Scanner(System.in);
GenericStack2<String> strings = new GenericStack2<>();
for (int i = 0; i < 5; i++) {
strings.add(input.nextLine());
}
for (int i = 0; i < 5; i++) {
System.out.println(strings.pop());
}
}
public int getsize(){
return size();
}
public E peek(){
return get(getsize()-1);
}
public void push(E o){
add(o);
}
public E pop(){
E o = get(getsize()-1);
remove(getsize()-1);
return o;
}
public boolean isEmpty(){
return isEmpty();
}
@Override
public String toString() {
return "stack: " + super.toString();
}
}
19.3 (ArrayList中的不同元素) 编写以下方法, 返回一个新的ArrayList。新的列表中包含来自原列表中的不重复元素。