zoukankan      html  css  js  c++  java
  • 实现队列(单向+双向)

    队列的话,FIFO是其主要特性。

    一、通过简单的链表来实现一个简单的单向队列。

    主要包括两个方法:

    put:加入元素导队列中去;

    take:取出队头元素;

    public interface MyQueue<T> {
        T take();
        void put(T item);
        class Node<T>{
            Node next;
            T item;
            public Node(T item){
                this.item = item;
                this.next = null;
            }
        }
    }

    实现类:

    主要定义一下类元素:队头节点,队尾节点,队列大小。

    put方法逻辑:

    如果队列为空,则新元素就是队头(同时也是队尾);如果队列不为空,则尾插再队尾节点之后,作为新的队尾节点;

    take方法逻辑:

    如果对列为空,(所有节点被take出去)则返回队列无数据。

    package study.queueStudy;
    
    public class MyQueueImpl<T> implements MyQueue<T>{
        public static Node head;
        public static Node tail;
        public static int size;
        public MyQueueImpl(){
            Node init = new Node(null);
            head = tail = init;
            size = 0;
        }
        @Override
        public T take() {
            Node currHead = head;
            if(currHead!=null&&size!=0){
                T result = (T) currHead.item;
                head = currHead.next;
                System.out.print(result+"
    ");
                size--;
                return result;
            }else {
                throw new IllegalArgumentException("队列无数据");
            }
        }
    
        @Override
        public void put(T item) {
            Node newNode = new Node(item);
            Node tailCurr = tail;
            Node headCurr = head;
            if(headCurr.item==null){
                head.item=item;
                tail.item=item;
                size++;
                return;
            }
            tailCurr.next = newNode;
            tail = newNode;
            size++;
        }
        public static void main(String[] args) {
            MyQueueImpl myQueue = new MyQueueImpl();
            myQueue.put(1);
            myQueue.put(2);
            myQueue.put(3);
            myQueue.put(4);
            myQueue.put(5);
            myQueue.put(6);
            myQueue.put(7);
            myQueue.put(8);
            myQueue.take();
            myQueue.take();
            myQueue.take();
            myQueue.take();
            myQueue.take();
            myQueue.take();
            myQueue.take();
        }
    }

    二、实现一个双向队列

    双向队列和单向队列的差别主要在于可以从链表头插入,也可以从链表尾插入。

  • 相关阅读:
    vue axios的使用
    html5 css写出一个实心三角形和空心三角行
    弹出新页面并使整个旧页面背景变暗功能的实现代码
    radio 单选按钮 选中多个
    搭建脚手架cli2.x环境
    页面滚动条位置触发事件
    DataGridView行号发生变化 使用的事件
    eclipse git 忽略文件
    eclipse git 分享项目到GitHub上
    eclipse git 创建新分支 合并分支 删除分支
  • 原文地址:https://www.cnblogs.com/hekiraku/p/11990843.html
Copyright © 2011-2022 走看看