数据结构与算法(Java版)_03_队列

队列

队列是一个有序列表,可以用数组或者链表来实现。

队列遵循先进先出的原则,即先存入队列的数据先被取出。

代码实现:

package dataStructureAtShangGuiGu;

import java.util.Scanner;

public class QueueDemo {
    public static void main(String[] args) {
        QueueTest queue = new QueueTest(3);
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while(loop) {
            sopInfo();
            char ch = scanner.next().charAt(0);
            switch(ch){
                case 'a':
                    System.out.println("请输入:");
                    queue.add(scanner.nextInt());
                    break;
                case 'g':
                    queue.get();
                    break;
                case 'h':
                    queue.showHead();
                    break;
                case 's':
                    queue.show();
                    break;
                case 'e':
                    loop = false;
                    scanner.close();
                    break;
                    
            }
        }
    }
    private static void sopInfo() {
        System.out.println("--------------------------");
        System.out.println("a(add)添加元素");
        System.out.println("g(get)获取元素");
        System.out.println("h(head)查看第一个元素");
        System.out.println("s(show)查看所有元素");
        System.out.println("e(exit)退出");
        System.out.println("--------------------------");
    }
}
class QueueTest{
    private int maxSize; //队列最大容量
    private int front; //队列头部指针
    private int rear;  //队列尾部指针
    private int[] arr; //作为队列存储容器
    QueueTest(int maxSize){ //初始化队列
        this.maxSize = maxSize;
        this.front = -1;
        this.rear = -1;
        this.arr = new int[maxSize];
    }
    private boolean isEmpty() { //判断队列是否需为空
        if(this.front==this.rear) return true;
        return false;
    }
    private boolean isFull() { //判断队列是否满了
        if(this.rear==(this.maxSize-1)) return true;
        return false;
    }
    public void add(int num) { //向队列添加数据
        if(this.isFull()) {
            System.out.println("队列已满,无法追加数据!");
            return;
        }
        this.rear++;
        this.arr[this.rear] =  num;
    }
    public void get() { //从队列获取一个数据
        if(this.isEmpty()) {
            System.out.println("队列为空!没有数据可以获取!");
            return;
        }
        this.front++;
        System.out.println("取出的元素是:"+arr[this.front]);
    }
    public void show() { //查看模拟队列容器情况
        for(int i=0;i<arr.length;i++) {
            System.out.printf("arr[%d]=%d\n",i,this.arr[i]);
        }
    }
    public void showHead() { //查看队列第一个元素
        if(this.isEmpty()) {
            System.out.println("队列为空!无法查看队列第一个元素!");
            return;
        }
        System.out.println("第一个元素是:"+this.arr[this.front+1]);
    }
}

 

运行测试:

先添加元素,然后查看第一个元素

 依次取一个元素,然后查看头元素

将队列元素取尽: 

 取尽元素后再添加:

 数据已经取完了,但是发现添加不了数据,因为指针rear已经到达队列后面了!

posted @ 2021-10-18 22:41  曾经沧海难为水。  阅读(27)  评论(0编辑  收藏  举报