Java数据结构与算法02——队列

标签:Java 数据结构 算法

作者 : Maxchen

版本 : V1.0.0

日期 : 2020/3/29


1.队列的概念

队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out)。我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列则称为空队。其一般结构如下1

image.png-57.1kB

2.数组模拟队列

我们使用数组来模拟一个简单的队列运行程序,整体运行流程如下图

队列.png-64.2kB

代码分两部分:第一部分ArrayQueue是使用数组来模拟队列,第二部分ArrayQueueDemo则是对此队列进行测试。

ArrayQueue 的代码如下

//使用数组模拟队列
class ArrayQueue{

    //数组最大容量
    private int maxSize;

    //队列头
    private int front;

    //队列尾
    private int rear;

    //存放数据并模拟队列
    private int[] arr;

    //队列构造器
    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;
        rear = -1;
    }

    //判断队列是否满
    public boolean isFull(){
        return rear == maxSize - 1;
    }

    //判断队列是否空
    public boolean isEmpty(){
        return rear == front;
    }

    //添加队列数据,入队列
    public void addQueue(int n){

        //队列满了不能加入数据
        if(isFull()){
            throw new RuntimeException("队列满了不能加入数据");
        }
        rear++;
        arr[rear] = n;
    }

    //获取队列数据,出队列
    public int getQueue(){

        //队列空,不能取数据
        if(isEmpty()){
            throw new RuntimeException("队列空,不能取数据");
        }
        front ++;
        return arr[front];

    }

    //显示队列所有数据
    public void showQueue(){

        //遍历
        if(isEmpty()){
            System.out.println("队列空,无数据");
            return;
        }
        for (int i=0; i< arr.length; i++){
            System.out.printf("arr[%d]=%d\n", i, arr[i]);
        }

    }

    //显示队列的头数据
    public int headQueue(){

        //判断
        if(isEmpty()){
            throw  new RuntimeException("队列空的,没有数据");
        }
        return arr[front + 1];

    }

}

ArrayQueueDemo 的代码如下

public class ArrayQueueDemo {

    public static void main(String[] args) {

        //创建队列
        ArrayQueue arrayQueue = new ArrayQueue(3);

        //接收用户输入
        char key = ' ';
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;

        //输出菜单
        while (loop){
            System.out.println("s(show)");
            System.out.println("e(exit)");
            System.out.println("a(add)");
            System.out.println("g(get)");
            System.out.println("h(head)");
            key = scanner.next().charAt(0);
            switch (key){
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("添加队列数据");
                    try {
                        int value = scanner.nextInt();
                        arrayQueue.addQueue(value);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'g':
                    try {
                        int res = arrayQueue.getQueue();
                        System.out.printf("获取队列数据:%d\n",res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据:%d\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }

        }

        System.out.println("程序结束");

    }

}

3.队列运行测试

第一步: 执行程序主函数,会初始化一个包含3个数组元素的空队列,输入s会显示队列空,无数据

image.png-8.7kB

第二步: 输入a提示添加队列数据,我们添加一个队列

image.png-8.3kB

第三步: 再次点击s,就会查询到刚才添加的队列数据

image.png-7.3kB

第四步: 继续添加队列,直到添加到第四个队列时会提示队列已满无法添加

image.png-59.3kB

第五步: 接下来我们用h查询队列头的数据,按g就会出一个队列,队列头变成下一个队列数组,直到队列获取完为止

image.png-43.1kB

image.png-9kB


  1. java数据结构与算法之(Queue)队列设计与实现 ↩︎

发布了16 篇原创文章 · 获赞 32 · 访问量 2370

猜你喜欢

转载自blog.csdn.net/u012420395/article/details/105236190