队列的概念和简单实现适合初学者

一 前言

本篇读者将学习到队列的概念,队列的基本操作方法,java自带的队列操作方式,简单的使用实现队列;知识追寻者都感觉队列比较好学,毕竟生活中无处不在;

二 队列的概念

队列是一种只能在一端(队尾)插入数据,另一端(队首)删除数据的线性结构;

如何简单的理解,比如做动车快要发车的时候,许多乘客都在进站的路口进行排队刷票,刷一张票就是进站一个人,就可以比作队首删除一个数据,同理如果有新乘客要上动车,则需要排在队尾,表示添加数据;

三 java原生的队列

队列的主要方法如下:

  • peek() 队首值
  • offer() 向队尾插入数据
  • poll() 队首值,并且删除队首
  • element() ,队列中弹出队首值
public static void main(String[] args) {
        // 创建队列
        Queue<String> queue = new LinkedList<>();
        // 往队列中加数据
        queue.offer("1");
        queue.offer("2");
        queue.offer("3");
        queue.offer("4");
        queue.offer("5");
        // 返回第一个元素
        System.out.println(queue.element());
        // 返回队首值
        System.out.println(queue.peek());
        // 返回第一个元素,并在队列中删除
        System.out.println(queue.poll());
        // 遍历队列
        for (String str: queue) {
            System.out.print(str);
        }
    }

输出

1
1
1
2345

四 队列的简单实现

实现思路,由于使用数组需要2个索引指针,前索引表示队首索引,后索引表示队尾索引;

当向队列中添加数据时后索引向后移动一位;当从队列中弹出数据时前索引向后移动一位;

同理根之前栈的文章一致,每种数据结构都应该有容量;

比较重要的一个算法是每当索引往后移动时,可以使用 ( rear + 1 ) % capacity 表示下一索引的位置;

比如 容量为6 , 此时数据的索引为2,插入数据后 索引 的值 就是 ( 2 + 1 ) % 6 = 3 ;

public class ArrayQueue {

    // 队首
    private int front;
    // 队尾
    private int rear;
    // 容量
    private int capacity;
    // 数组
    private Object[] array;

    // 构造方法
    ArrayQueue(int size) {
        capacity = size;
        // 队首初始化值 -1 表示空队列
        front = -1;
        // 队尾初始化值 -1 ,表示空队列
        rear = -1;
        array = new Object[capacity];
    }

    // 空队列
    public boolean isEmpty(){
        // 如果队首是默认值-1,就是空队列
        return front == -1;
    }

    // 满队列
    public boolean isFull(){
        // 如果队尾索引等于队首, 就是满队列
        return ( rear + 1 ) % capacity == front;
    }



    // 入队
    public void offer(int data){
        if (isFull()){
            System.out.println("队列已满");
        }else {
            // 队尾 + 后移
            rear = (rear + 1) % capacity;
            // 数据进入队列
            array[rear] = data;
            // 保证第一次数据入队时,队首索引=队尾索引=0
            if (front==-1){
                front = rear;
            }
        }
    }

    // 出队
    public Object poll(){
        Object data = null;
        if (isEmpty()){
            System.out.println("空队列");
        }else {
            // 队首出队
            data = array[front];
            // 队首索引 后移
            front = (front + 1) % capacity;

        }
        return data;
    }

    public Object peek(){
        return array[front];
    }

 
}

测试

  public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(4);
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.peek());
        System.out.println(queue.poll());

    }

输出

1
2
3
null
null

当然使用数据的实现方式,很浪费空间,一站式应用仅提供学习理解队列;

发布了148 篇原创文章 · 获赞 375 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/youku1327/article/details/105057325