【队列】循环顺序队列和链式队列

IQueue.java

public interface IQueue<T> {
    int count();
    // 队列是否为空
    boolean isEmpty();
    void clear();
    // 添加元素到队尾
    void add(T item);
    // 出队
    T out();
    T getFront();

}

CSeqQueue.java

public class CSeqQueue<T> implements IQueue<T> {
    private T[]data;
    private int maxsize;
    private int front;
    private int rear;

    public CSeqQueue(int maxsize){
        data = (T[]) new Object[maxsize];
        this.maxsize=maxsize;
        front =rear=0;
    }

    @Override
    public int count() {
        return (rear - front + maxsize) % maxsize;
    }

    @Override
    public boolean isEmpty() {
        return front == rear;
    }

    @Override
    public void clear() {
        front = rear;
    }

    @Override
    public void add(T item) {
        if ((rear +1 + maxsize) % maxsize == front) {
            System.out.println("队列已满!");
            return;
        }
        rear = (rear +1) % maxsize;
        data[rear] = item;
    }

    @Override
    public T out() {
        if (isEmpty()) {
            throw new RuntimeException("队列已经满了!");
        }
        front = (front + 1) % maxsize;
        return data[front];
    }

    @Override
    public T getFront() {
        if (isEmpty()) {
            throw new RuntimeException("队列已经满了!");
        }
        return data[front + 1];
    }
}


CSeqQueueMain.java

public class CSeqQueueMain {
    public static void main(String[] args) {
        // 创建一个容量为5的循环队列
        CSeqQueue<Integer> queue = new CSeqQueue<Integer>(10);

        // 测试isEmpty方法
        System.out.println("队列是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试in方法,向队列中添加元素
        queue.add(10);
        queue.add(20);
        queue.add(30);
        queue.add(40);
        queue.add(10);
        queue.add(20);
        queue.add(30);

        // 测试count方法
        System.out.println("队列中的元素数量: " + queue.count());

        // 测试getFront方法
        System.out.println("队列的头部元素: " + queue.getFront());

        // 测试out方法,移除队列中的元素
        System.out.println("移除的元素: " + queue.out());
        System.out.println("移除的元素: " + queue.out());

        // 再次测试count方法
        System.out.println("队列中的元素数量: " + queue.count());

        // 测试clear方法
        queue.clear();
        System.out.println("队列是否为空: " + queue.isEmpty());

        // 测试队列满的情况
        queue.add(50);
        queue.add(60);
        queue.add(70);
        queue.add(80);
        queue.add(90); // 队列已满,无法继续添加
        queue.add(100); // 应该输出 "Queue is full!"

        // 测试count方法
        System.out.println("队列中的元素数量: " + queue.count()); // 应该输出 4
    }
}

Node.java

public class Node<T> {
    T data;
    Node<T> next;

    public Node() {
    }

    public Node(T data) {
        this.data = data;
        this.next = null;
    }
}


LinkQueue.java


public class LinkQueue<T> implements IQueue<T> {
    private Node<T> front;
    private Node<T> rear;
    public LinkQueue() {
        front = rear = new Node<T>();
    }

    @Override
    public int count() {
        Node<T> p = front;
        int len = 0;
        while (p != null) {
            ++len;
            p = p.next;
        }
        return len-1;
    }

    @Override
    public boolean isEmpty() {
        return front.next == null;
    }

    @Override
    public void clear() {
        front.next = null;
        rear = front;
    }

    @Override
    public void add(T item) {
        Node<T> q = new Node<T>(item);
        rear.next = q;
        rear = q;
    }

    @Override
    public T out() {
        if (isEmpty()) {
            throw  new RuntimeException("Queue is empty");
        }
        Node<T> p = front.next;
        front.next = p.next;
        if (count() == 0) {
            rear = front;
        }
        return p.data;
    }

    @Override
    public T getFront() {
        if (isEmpty()) {
            throw  new RuntimeException("Queue is empty");
        }
        Node<T> p = front.next;
        return p.data;
    }
}


LinkQueueMain.java

public class LinkQueueMain {

    public static void main(String[] args) {
        // 创建一个LinkQueue对象
        LinkQueue<Integer> queue = new LinkQueue<Integer>();

        // 测试isEmpty()方法
        System.out.println("队列是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试in()方法
        queue.add(10);
        queue.add(20);
        queue.add(30);

        // 测试count()方法
        System.out.println("队列中的元素数量: " + queue.count()); // 应该输出 3

        // 测试getFront()方法
        System.out.println("队头元素: " + queue.getFront()); // 应该输出 10

        // 测试out()方法
        System.out.println("出队元素: " + queue.out()); // 应该输出 10
        System.out.println("出队后队列中的元素数量: " + queue.count()); // 应该输出 2

        // 再次测试getFront()方法
        System.out.println("队头元素: " + queue.getFront()); // 应该输出 20

        // 测试clear()方法
        queue.clear();
        System.out.println("清空队列后是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试在空队列上调用out()和getFront()方法
        try {
            queue.out();
        } catch (RuntimeException e) {
            System.out.println("尝试从空队列出队时抛出异常: " + e.getMessage());
        }

        try {
            queue.getFront();
        } catch (RuntimeException e) {
            System.out.println("尝试获取空队列的队头元素时抛出异常: " + e.getMessage());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值