在java中实现队列
在Java中实现队列是一个非常常见的面试问题。 我在线浏览并看到许多实现,他们做了很多花哨的东西,如实现队列接口和编写自己的addLast()
和removeFirst()
方法。 我的问题是我不能只使用LinkedList()
类并使用其预定义的方法addLast
和removeFirst
方法来做同样的事情? 例如
LinkedList qu=new LinkedList(); qu.add(new Student("anadkat1")); qu.add(new Student("anadkat2")); qu.add(new Student("anadkat5")); System.err.println(qu); qu.removeFirst(); System.err.println(qu);
这给了我完美的结果。 这不够吗?
public class Queue{ private LinkedList list=new LinkedList<>(); public void insert(T element){ list.addLast(element); } public void remove(){ list.removeFirst(); } public int size(){ return list.size(); } public T element(){ return list.getFirst(); } }
我最近经历过这些面试问题。
使用set方法从列表中添加,删除,chekForEmpty等是实现队列的一般方法。
例如 :
public void enqueue(E item) { list.addLast(item); } public E dequeue() { return list.poll(); } public boolean hasItems() { return !list.isEmpty(); } public int size() { return list.size(); } public void addItems(GenQueue extends E> l) { while (l.hasItems()) list.addLast(l.dequeue()); }
一种方法是将一个项q
和两个索引的数组保持到队列的头部和尾部(最初设置为0)。 伪代码如下:
enqueue(x) { q[tail++] = x; } dequeue() { return q[head++]; }
如果数组溢出,则将大小加倍并重新插入项目。 这产生每次操作的O(1)摊销时间。 另一种方法是使用链接列表(您应该实现)并再次存储指向头部的指针和指向尾部的指针。