首页 > 代码库 > 算法(Algorithms)第4版 练习 1.3.29

算法(Algorithms)第4版 练习 1.3.29

代码实现:

//1.3.29
package com.qiusongde.linkedlist;

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

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

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

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

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

        //it is important that this class cannot change the CircularQueue
        //so we can only change precurrent and can‘t change precurrent.next
        private Node precurrent;
        
        public CircularQueueIterator() {
            precurrent = last;
        }
        
        @Override
        public boolean hasNext() {
            return precurrent != null;
        }

        @Override
        public Item next() {
            if(!hasNext())
                throw new NoSuchElementException("Queue is empty");
            
            Item item = precurrent.next.item;
            
            if(last == last.next) {//one node
                precurrent = null;//end
            } else {
                precurrent = precurrent.next;
                if(precurrent == last) {//precurrent equals last again
                    precurrent = null;//end
                }
            }
                
            return item;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
        
    }
    
    public static void main(String[] args) {
        
        CircularQueue<String> queue = new CircularQueue<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();
                }
            }
            
        }
        
    }

}

测试数据;

to
be
or
not
to
-
be
-
-
that
-
-
-
is

 

输出结果:

Initialized size:0
enqueue success:to size:1
Left on queue: to 
enqueue success:be size:2
Left on queue: to be 
enqueue success:or size:3
Left on queue: to be or 
enqueue success:not size:4
Left on queue: to be or not 
enqueue success:to size:5
Left on queue: to be or not to 
dequeue success:to size:4
Left on queue: be or not to 
enqueue success:be size:5
Left on queue: be or not to be 
dequeue success:be size:4
Left on queue: or not to be 
dequeue success:or size:3
Left on queue: not to be 
enqueue success:that size:4
Left on queue: not to be that 
dequeue success:not size:3
Left on queue: to be that 
dequeue success:to size:2
Left on queue: be that 
dequeue success:be size:1
Left on queue: that 
enqueue success:is size:2
Left on queue: that is

 

算法(Algorithms)第4版 练习 1.3.29