算法(Algorithms)第4版 练习 1.3.15

Queue:

package com.qiusongde;

import java.util.Iterator;
import java.util.NoSuchElementException;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Queue<Item> implements Iterable<Item> {

    private Node first;
    private Node last;
    private int n;
    
    private class Node {
        Item item;
        Node next;
    }
    
    public Queue() {
        first = null;
        last = null;
        n = 0;
    }
    
    public boolean isEmpty() {
        return first == null;
    }
    
    public int size() {
        return n;
    }
    
    public void enqueue(Item item) {
        //add item to the end
        Node oldlast = last;
        
        last = new Node();
        last.item = item;
        last.next = null;//end
        
        if(isEmpty())
            first = last;
        else
            oldlast.next = last;
        
        n++;
        
    }
    
    public Item dequeue() {
        if(isEmpty())
            throw new NoSuchElementException("Queue is empty");
        
        Item item = first.item;
        first = first.next;
        
        if(isEmpty())
            last = null;
        n--;
                
        return item;
    }

    @Override
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }
    
    private class QueueIterator implements Iterator<Item> {

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

        @Override
        public Item next() {
            if(!hasNext())
                throw new NoSuchElementException("Queue is empty");
            
            Item item = current.item;
            current = current.next;
            
            return item;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
        
    }
    
    public static void main(String[] args) {
        
        Queue<String> queue = new Queue<String>();
        StdOut.println("Initialized size:" + queue.size());
        
        while (!StdIn.isEmpty()) {
            
            String item = StdIn.readString();
            
            if (!item.equals("-")) {
                
                queue.enqueue(item); 
                StdOut.println("enqueue success:" + item + " size:" + queue.size());
                
                StdOut.print("Left on queue: ");
                for (String s : queue) {
                    StdOut.print(s + " ");
                }
                StdOut.println();
                
            } else {
                if(queue.isEmpty())
                    StdOut.println("dequeue error, queue empty");
                else {
                    StdOut.println("dequeue success:" + queue.dequeue() + " size:" + queue.size());
                    
                    StdOut.print("Left on queue: ");
                    for (String s : queue) {
                        StdOut.print(s + " ");
                    }
                    StdOut.println();
                }
            }
            
        }
        
    }

}

 测试用例:

package com.qiusongde;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Exercise1315 {

    public static void main(String[] args) {
        
        int k = Integer.parseInt(args[0]);
        Queue<String> queue = new Queue<>();
        
        while(!StdIn.isEmpty()) {
            String s = StdIn.readString();
            
            queue.enqueue(s);
        }
        
        int size = queue.size();
        for(int i = 0; i < size - k; i++) {
            queue.dequeue();
        }
        
        StdOut.println(queue.dequeue());
    }

}

测试结果:

1 2 3 4 5 6 7
3
原文地址:https://www.cnblogs.com/songdechiu/p/6513735.html