队列2:通过链表和集合实现队列

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列2:通过链表和集合实现队列相关的知识,希望对你有一定的参考价值。

​数组实现队列问题还比较多,判断重点等还比较绕,使用链表则容易很多,另外我们还可以基于jdk提供的集合类来辅助我们实现一个队列。我们首先使用链表看一下。

1.基于链表实现队列

public class LinkQueue {    private Node front;    private Node rear;    private int size;    public LinkQueue() {        this.front = new Node();        this.rear = new Node();    }    /**     * 入队     * @param value     */    public void in(Object value)throws  Exception{      Node newNode = new Node(value);      Node temp = front;      while (temp.next != null){          temp = temp.next;      }      temp.next = newNode;      rear = newNode;      size ++;    }    /**     * 出队     * @throws Exception     */    public Object out()throws  Exception{        if(front.next == null){            throw new  Exception("队列为空异常");        }        Node firstNode = front.next;        front.next = firstNode.next;        size--;        return firstNode.data;    }    /**     * 遍历队列     */    public void traverse(){        Node temp = front.next;        while ( temp != null){            System.out.println(""+temp.data);            temp = temp.next;        }    }}

2.基于jdk的集合类实现队列

其实jdk中本身已经提供了队列Queue,不过呢,我们基于ArrayList来自己实现一个:‍

import java.util.*;/*** 使用集合实现队列功能,使用int数组保存数据特点:先进先出,后进后出*/public class QueueTest2 {      public static void main(String[] args){          //测试队列        System.out.println("测试队列:");        Queue queue = new Queue();          queue.in(1);          queue.in(2);          queue.in(3);          System.out.println(queue.out());         System.out.println(queue.out());         queue.in(4);          System.out.println(queue.out());          System.out.println(queue.out());          queue.in(5);          System.out.println(queue.out());     }  }  //使用集合定义一个队列class Queue {      List<Integer> list = new ArrayList<Integer>();      int index = 0;  //下标    //入队    public void in(int n){          list.add(n);          index++;      }     //出队    public int out(){         if(!list.isEmpty()){             index--;             return list.remove(0);         }         return -1;      }  }

这个题目如果自己做,还是挺复杂的,如果要考察重点应是设计能力,我们就可以使用jdk提供的ArrayList或者LinkedList来漂亮的解决我们的问题,例如下面这个:

3.LeetCode1670:设计一个前中后队列

请你设计一个队列,支持在前,中,后三个位置的 push 和 pop 操作。

请你完成 FrontMiddleBack 类:

  • FrontMiddleBack() 初始化队列。

  • void pushFront(int val) 将 val 添加到队列的 最前面 。

  • void pushMiddle(int val) 将 val 添加到队列的 正中间 。

  • void pushBack(int val) 将 val 添加到队里的 最后面 。

  • int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。

  • int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。

  • int popBack() 将 最后面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1 。

请注意当有 两个 中间位置的时候,选择靠前面的位置进行操作。比方说:

  • 将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5] 。

  • 从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6] 。

如果使用linkedList,题目将非常简单:

class FrontMiddleBackQueue {  LinkedList<Integer> linkedList=new LinkedList<>();    int sum=0;    public FrontMiddleBackQueue() {    }    public void pushFront(int val) {        linkedList.addFirst(val);        sum++;    }    public void pushMiddle(int val) {        int mid=sum/2;        linkedList.add(mid,val);        sum++;    }    public void pushBack(int val) {        linkedList.addLast(val);        sum++;    }    public int popFront() {        if(linkedList.size()==0){            return -1;        }        int z=linkedList.getFirst();        linkedList.removeFirst();        sum--;        return z;    }    public int popMiddle() {        if(linkedList.size()==0){            return -1;        }        int mid = sum/2;        int z;        if(sum%2==0){            z=linkedList.get(mid-1);        }else{            z=linkedList.get(mid);        }        linkedList.remove(linkedList.indexOf(z));        sum--;        return z;    }    public int popBack() {        if(linkedList.size()==0){            return -1;        }        int z=linkedList.getLast();        linkedList.removeLast();        sum--;        return z;    }}

以上是关于队列2:通过链表和集合实现队列的主要内容,如果未能解决你的问题,请参考以下文章

实现一个链表和队列

6链表和数组,哪个实现队列更快?

Java栈[数组,单链表],队列数组,链表和循环队列的实现

4-3《Java中所有集合》——链表和二叉树CollectionListSetMapIterator迭代器集合在JDK9中的新特性

基础数据结构

20172332 2017-2018-2 《程序设计与数据结构》第三周学习总结