《Java语言程序设计与数据结构》编程练习答案(第二十四章)(一)

《Java语言程序设计与数据结构》编程练习答案(第二十四章)(一)

英文名:Introduction to Java Programming and Data Structures, Comprehensive Version, 11th Edition

24.1

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

    }


}

interface MyList<T> extends Collection<T>{
    public void add(int index, T e);

    public T get(int index);

    public int indexOf(Object o);

    public int lastIndexOf(Object o);

    public T remove(int index);

    public T set(int index, T e);

    @Override
    public default boolean add(T e){
        add(size(), e);
        return true;
    }

    @Override
    public default boolean isEmpty(){
        return size() == 0;
    }

    @Override
    public default boolean remove(Object e){
        if(indexOf(e) >= 0){
            remove(indexOf(e));
            return true;
        }
        else
            return false;
    }

    @Override
    public default boolean containsAll(Collection<?> c){
        for (Object o : c) {
            if (indexOf(o) == -1) {
                return false;
            }
        }
        return true;
    }

    @Override
    public default boolean addAll(Collection<? extends T> c){
        for(T t: c){
            add(t);
        }
        return true;
    }

    @Override
    public default boolean removeAll(Collection<?> c){
        for(Object o: c){
            remove(o);
        }
        return true;
    }

    @Override
    public default boolean retainAll(Collection<?> c){
        for(T t:this){
            if(!c.contains(t)){
                remove(t);
            }
        }
        return true;
    }

    @Override
    public default Object[] toArray(){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray();
    }

    @Override
    public default <E> E[] toArray(E[] array){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray(array);
    }
}

24.2

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

    }


}

interface MyList<T> extends Collection<T>{
    public void add(int index, T e);

    public T get(int index);

    public int indexOf(Object o);

    public int lastIndexOf(Object o);

    public T remove(int index);

    public T set(int index, T e);

    @Override
    public default boolean add(T e){
        add(size(), e);
        return true;
    }

    @Override
    public default boolean isEmpty(){
        return size() == 0;
    }

    @Override
    public default boolean remove(Object e){
        if(indexOf(e) >= 0){
            remove(indexOf(e));
            return true;
        }
        else
            return false;
    }

    @Override
    public default boolean containsAll(Collection<?> c){
        for (Object o : c) {
            if (indexOf(o) == -1) {
                return false;
            }
        }
        return true;
    }

    @Override
    public default boolean addAll(Collection<? extends T> c){
        for(T t: c){
            add(t);
        }
        return true;
    }

    @Override
    public default boolean removeAll(Collection<?> c){
        for(Object o: c){
            remove(o);
        }
        return true;
    }


    @Override
    public default Object[] toArray(){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray();
    }

    @Override
    public default <E> E[] toArray(E[] array){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray(array);
    }
}

class MyLinkedList<T> implements MyList<T>{

    private Node<T> head, tail;
    private int size = 0;

    @Override
    public void add(int index, T e) {

    }


    @Override
    public T remove(int index) {
        return null;
    }

    @Override
    public int size() {
        return 0;
    }


    @Override
    public Iterator<T> iterator() {
        return null;
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return false;
    }

    @Override
    public void clear() {

    }

    @Override
    public boolean contains(Object e){
        Node<T> current = head;
        while(current!=null){
            if(current.element.equals(e)){
                return true;
            }
            current = current.next;
        }
        return false;
    }

    @Override
    public T get(int index){
        Node<T> current = head;
        for(int i=0;i<index;i++){
            if(current == null){
                return null;
            }else{
                current = current.next;
            }
        }
        return current.element;
    }

    @Override
    public int indexOf(Object e){
        Node<T> current = head;
        int i=0;
        while(current!=null){
            if(current.element.equals(e)){
                return i;
            }
            i++;
            current = current.next;
        }
        return -1;
    }

    @Override
    public int lastIndexOf(Object e){
        int ret = -1;
        Node<T> current = head;
        int currentIndex = 0;
        while(current!=null){
            if(current.element.equals(e)){
                ret = currentIndex;
            }
            currentIndex++;
            current = current.next;
        }
        return ret;
    }
    
    @Override
    public T set(int index, T e){
        Node<T> current = head;
        for(int i=0;i<index;i++){
            if(current == null){
                return null;
            }else{
                current = current.next;
            }
        }
        T ret = current.element;
        current.element = e;
        return ret;
    }

    private static class Node<T>{
        T element;
        Node<T> next;
        public Node(T e){
            element = e;
        }
    }

}

24.3

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

    }


}

interface MyList<T> extends Collection<T>{
    public void add(int index, T e);

    public T get(int index);

    public int indexOf(Object o);

    public int lastIndexOf(Object o);

    public T remove(int index);

    public T set(int index, T e);

    @Override
    public default boolean add(T e){
        add(size(), e);
        return true;
    }

    @Override
    public default boolean isEmpty(){
        return size() == 0;
    }

    @Override
    public default boolean remove(Object e){
        if(indexOf(e) >= 0){
            remove(indexOf(e));
            return true;
        }
        else
            return false;
    }

    @Override
    public default boolean containsAll(Collection<?> c){
        for (Object o : c) {
            if (indexOf(o) == -1) {
                return false;
            }
        }
        return true;
    }

    @Override
    public default boolean addAll(Collection<? extends T> c){
        for(T t: c){
            add(t);
        }
        return true;
    }

    @Override
    public default boolean removeAll(Collection<?> c){
        for(Object o: c){
            remove(o);
        }
        return true;
    }


    @Override
    public default Object[] toArray(){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray();
    }

    @Override
    public default <E> E[] toArray(E[] array){
        ArrayList<T> tmp = new ArrayList<>(this);
        return tmp.toArray(array);
    }
}

class TwoWayLinkedList<T> implements MyList<T>{

    private Node<T> head,tail;
    private int size = 0;

    public TwoWayLinkedList(){

    }

    @Override
    public void add(int index, T e) {
        if(index == 0){
            addFirst(e);
        }else if(index >= size){
            addLast(e);
        }else{
            Node<T> current = head;
            for(int i=1;i<index;i++){
                current = current.next;
            }
            Node<T> tmp = current.next;
            current.next = new Node<>(e);
            (current.next).previous = tmp.previous;
            (current.next).next = tmp;
            tmp.previous = current.next;
            size++;
        }
    }

    public void addFirst(T e){
        Node<T> newNode = new Node<>(e);
        newNode.next = head;
        head.previous = newNode;
        size++;
        if(tail == null){
            tail = head;
        }
    }

    public void addLast(T e){
        Node<T> newNode = new Node<>(e);
        if(tail == null){
            head = tail = newNode;
        }
        else{
            tail.next = newNode;
            newNode.previous = tail;
            tail = newNode;
        }
        size++;
    }

    @Override
    public T get(int index) {
        if(index < 0 || index >=size){
            return null;
        }else{
            Node<T> current = head;
            for(int i=0;i<index;i++){
                current = current.next;
            }
            return current.element;
        }
    }

    @Override
    public int indexOf(Object o) {
        Node<T> current = head;
        for(int i=0;i<size-1;i++){
            if(current.element.equals(o)){
                return i;
            }
            current = current.next;
        }
        return -1;
    }

    @Override
    public int lastIndexOf(Object o) {
        Node<T> current = tail;
        for(int i=size-1;i>0;i--){
            if(current.element.equals(o)){
                return i;
            }
            current = current.previous;
        }
        return -1;
    }

    @Override
    public T 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<T> previous = head;
            for(int i=1;i<index;i++){
                previous = previous.next;
            }
            Node<T> current = previous.next;
            previous.next = current.next;
            (previous.next).previous = previous;

            size--;
            return current.element;
        }
    }

    public T removeFirst(){
        if(size == 0){
            return null;
        }
        else{
            Node<T> tmp = head;
            head = head.next;
            if(head != null) {
                head.previous = null;
            }else{
                tail = null;
            }
            size--;
            return tmp.element;
        }
    }

    public T removeLast(){
        if(size == 0){
            return null;
        }
        else if(size == 1){
            Node<T> tmp = head;
            head = tail = null;
            size = 0;
            return tmp.element;
        }else{
            Node<T> current = head;
            for(int i=0;i<size - 2;i++){
                current = current.next;
            }
            Node<T> tmp = tail;
            tail = current;
            tail.next = null;
            tmp.previous = null;
            size--;
            return tmp.element;
        }
    }

    @Override
    public T set(int index, T e) {
        if(index < 0 || index >= size){
            return null;
        }
        else{
            Node<T> current = head;
            for(int i=0;i<index;i++){
                current = current.next;
            }
            T ret = current.element;
            current.element = e;
            return ret;
        }
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean contains(Object o) {
        Node<T> current = head;
        for(int i=0;i<size-1;i++){
            if(current.element.equals(o)){
                return true;
            }
        }
        return false;
    }

    @Override
    public Iterator<T> iterator() {
        return new TwoWayLinkedListIterator();
    }

    public Iterator<T> iterator(int index){
        return new TwoWayLinkedListIterator(index);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        for(Object o: c){
            if(!this.contains(o)){
                remove(o);
            }
        }
        return true;
    }

    @Override
    public void clear() {
        size = 0;
        head = tail = null;
    }

    private static class Node<T>{
        T element;
        Node<T> next;
        Node<T> previous;

        public Node(T e){
            element = e;
        }
    }

    private class TwoWayLinkedListIterator implements Iterator<T>{

        private Node<T> current = head;
        public TwoWayLinkedListIterator(){}
        public TwoWayLinkedListIterator(int index){
            for(int i=0;i<index;i++){
                head = head.next;
            }
        }

        @Override
        public boolean hasNext() {
            return current != null;
        }

        @Override
        public T next() {
            T e = current.element;
            current = current.next;
            return e;
        }

        @Override
        public void remove(){
            if(size == 0){

            }else if(size == 1){
                head = tail = null;
                size = 0;
            }else if(current.next == null){
                removeLast();
            }else if(current.previous == null){
                removeFirst();
            }else{
                current.next = (current.previous).next;
                (current.next).previous = current.previous;
                size--;
            }
        }
    }
}

24.4

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Stack<Integer> stack = new Stack<>();
        int number = 2;
        while(stack.size() < 50){
            if(checkPrime(number)){
                stack.add(number);
            }
            number++;
        }
        while (!stack.empty()){
            System.out.print(stack.pop()+" ");
        }
    }

    public static boolean checkPrime(int number){
        for(int i=2;i<=number/2;i++){
            if(number % i == 0){
                return false;
            }
        }
        return true;
    }
}

24.5

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

    }
    
}

class GenericQueue<T> extends LinkedList<T>{
    public void enqueue(T e){
        addLast(e);
    }

    public T dequeue(){
        return removeFirst();
    }

    public int getSize(){
        return this.size();
    }
    
}

24.6

public class book {


    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

    }

}

class MyPriorityQueue<T> {
    private HeapWithComparator<T> heapWithComparator;
    public MyPriorityQueue(){

    }

    public MyPriorityQueue(Comparator<? super T> comparator){
        this.heapWithComparator = new HeapWithComparator<>(comparator);
    }
    
    public void enqueue(T e){
        heapWithComparator.add(e);
    }
    
    public T dequeue(){
        return heapWithComparator.remove();
    }
    
    public int getSize(){
        return heapWithComparator.getSize();
    }
}


class HeapWithComparator<T> {
    private ArrayList<T> list = new ArrayList<>();
    private Comparator<? super T>comparator;


    public HeapWithComparator(){
        this.comparator = new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                return o1.toString().compareTo(o2.toString());
            }
        };
    }

    public HeapWithComparator(Comparator<? super T> comparator){
        this.comparator = comparator;
    }

    public void add(T newObject){
        list.add(newObject);
        int currentIndex = list.size()-1;
        while(currentIndex > 0){
            int parentIndex = (currentIndex-1) / 2;
            if(comparator.compare(list.get(currentIndex),list.get(parentIndex)) > 0){
                T tmp = list.get(currentIndex);
                list.set(currentIndex, list.get(parentIndex));
                list.set(parentIndex, tmp);
            }else{
                break;
            }
            currentIndex = parentIndex;
        }
    }

    public T remove(){
        if(list.size() == 0)
            return null;
        T removeObject = list.get(0);
        list.set(0, list.get(list.size()-1));
        list.remove(list.size()-1);

        int currentIndex = 0;
        while(currentIndex < list.size()){
            int leftChildIndex = 2*currentIndex + 1;
            int rightChildIndex = 2*currentIndex + 2;

            if(leftChildIndex >= list.size())
                break;
            int maxIndex = leftChildIndex;
            if(rightChildIndex < list.size()){
                if(comparator.compare(list.get(maxIndex), list.get(rightChildIndex)) < 0){
                    maxIndex = rightChildIndex;
                }
            }

            if(comparator.compare(list.get(currentIndex), list.get(maxIndex)) < 0){
                T tmp = list.get(maxIndex);
                list.set(maxIndex, list.get(currentIndex));
                list.set(currentIndex, tmp);
                currentIndex = maxIndex;
            }
            else{
                break;
            }
        }
        return removeObject;
    }

    public int getSize(){
        return list.size();
    }

}
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值