zoukankan      html  css  js  c++  java
  • 队列的概念和简单实现

    一 前言

    本篇读者将学习到队列的概念,队列的基本操作方法,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
    

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

  • 相关阅读:
    图-拓扑排序
    图-最短路径-Dijkstra及其变种
    【链表问题】打卡7:将单向链表按某值划分成左边小,中间相等,右边大的形式
    【链表问题】打卡5:环形单链表约瑟夫问题
    【链表问题】打卡6:三种方法带你优雅判断回文链表
    【链表问题】打卡4:如何优雅着反转单链表
    【链表问题】打卡3:删除单链表的中间节点
    【链表问题】打卡2:删除单链表的第 K个节点
    史上最全面试题汇总,没有之一,不接受反驳
    一些可以让你装逼的算法技巧总结
  • 原文地址:https://www.cnblogs.com/zszxz/p/12554980.html
Copyright © 2011-2022 走看看